Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потоки 
:(
    Опции темы
Ораситель
Дата 16.9.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



Добрый день. 
Помогите пожалуйста организовать потоки.
есть класс, в котором есть метод main, который должен вызывать метод doit()
Код

public class A {
public A() {}

public void doIt() {
// Something do here
}

public static void main (String ... args) {
A obj = new A();
int count = 10;
obj.doIt();
}
}

мне нужно:
Сделать так, чтобы метод main  вызывал obj.doIt(); то количество раз, сколько указанно в count
 smile 
Подскажите пожалуйста.
PM MAIL   Вверх
kosmonaFFFt
Дата 17.9.2010, 04:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



А при чем тут потоки?


--------------------
user posted image
PM MAIL ICQ   Вверх
Metal_Heart
Дата 17.9.2010, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



Если, всё-таки через потоки, то класс А надо сделать, например, Runable и реализовать метод run:
Код

class A implements Runnable{
...

public void run() {
// Something do here
}
}


и далее в main порождаешь кол-во объектов, заданных в count и каждый запускаешь.
В конце не забудь указать метод join чтоб дождаться завершения потоков.


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Ораситель
Дата 17.9.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



Metal_Heart, спасибо, сделал, но все равно не работает
Код

public class SendMessage extends HttpServlet implements Runnable {
 public void sendMessages(Integer i) { 
//do Something
}
protected void service(HttpServletRequest request, HttpServletResponse response) {     
     new Thread(new SendMessage()).start();     
    }
public void run() {
        List<Integer> count;
        try {
          count = Factory.getInstance().getMessageDAO().get();
          if (count.size() > 0) {
              for(Integer i = 1; i <= count.size(); i++) {
                  sendMessages(i);
                  Thread.sleep(10000);
                  logger.info(" ---------------------------  Thread is over -------------------" );    
              }
          }        
    }
}

Все равно не работает. Метод вызывается только один раз ... 
PM MAIL   Вверх
AntonSaburov
Дата 17.9.2010, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



А размер списка count ты проверял ? Он больше 1 ?
PM MAIL WWW ICQ   Вверх
Ораситель
Дата 17.9.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



AntonSaburov, да,  значение = 5
PM MAIL   Вверх
Ораситель
Дата 17.9.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



Цитата(kosmonaFFFt @  17.9.2010,  04:27 Найти цитируемый пост)
А при чем тут потоки? 

а есть другие варианты вызывать метод каждые 10 секунд после заверешения  работы предыдущего ? 
PM MAIL   Вверх
nc30
Дата 17.9.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата(Metal_Heart @ 17.9.2010,  06:36)
В конце не забудь указать метод join чтоб дождаться завершения потоков.

Можно с этого момента поподробнее?

У меня похожая ситуация: главный поток в цикле порождает несколько потоков, которые должны параллельно отработать. Главный поток должен дождаться завершения порожденных и вывести результаты их работы.
Если я делаю так:
Код

        while ((obj = getObj()) != null) {

            MyThread mt = new MyThread(obj);
            mt.start();

            try {
                mt.join();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
 то все порожденные потоки выполняются последовательно один за другим, что не есть хорошо.

Другие варианты, которые пришли на мысль вместо использования join():
1) Поставить после цикла while: Thread.sleep(1500). В течении этого времени порожденные потоки успевают отработать. Ненадежно и некрасиво.
2) Записывать порожденные потоки в коллекцию threads. Затем после окончания while:
Код

        boolean smbLive;
        do {
            smbLive = false;
            for (Thread thr : threads) {
                if (thr.isAlive()) {
                    smbLive = true;
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } while (smbLive);
 Это работает, но здесь приходится создавать дополнительную коллекцию.
3) С приоритетами нет 100% гарантии.

Как лучше поступить?  smile 


UPD:
Перенес в новую тему.

Это сообщение отредактировал(а) nc30 - 18.9.2010, 06:04
PM MAIL   Вверх
Ораситель
Дата 17.9.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



nc30, млин, чувак, создай свою тему.
PM MAIL   Вверх
jk1
Дата 17.9.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



nc30, как насчет использования CyclicBarrier? Вот тривиальный пример на суммирование элементов матрицы. Несколько потоков суммируют каждый свою строку, а после их завершения специальный поток суммирует их результаты:
Код

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
 
public class CyclicBarrierExample
{
    private static int matrix[][] = 
    { 
        { 1 }, 
        { 2, 2 }, 
        { 3, 3, 3 },
        { 4, 4, 4, 4 }, 
        { 5, 5, 5, 5, 5 } };
 
    private static int results[];
 
    private static class Summer extends Thread
    {
        int row;
 
        CyclicBarrier barrier;
 
        Summer(CyclicBarrier barrier, int row)
        {
            this.barrier = barrier;
            this.row = row;
        }
 
        public void run()
        {
            int columns = matrix[row].length;
            int sum = 0;
            for (int i = 0; i < columns; i++)
            {
                sum += matrix[row][i];
            }
            results[row] = sum;
            System.out.println("Results for row " + row + " are : " + sum);
            // wait for others
            try
            {
                barrier.await();
            } catch (InterruptedException ex)
            {
                ex.printStackTrace();
            } catch (BrokenBarrierException ex)
            {
                ex.printStackTrace();
            }
        }
    }
 
    public static void main(String args[])
    {
        final int rows = matrix.length;
        results = new int[rows];
        Runnable merger = new Runnable()
        {
            public void run()
            {
                int sum = 0;
                for (int i = 0; i < rows; i++)
                {
                    sum += results[i];
                }
                System.out.println("Results are: " + sum);
            }
        };

        CyclicBarrier barrier = new CyclicBarrier(rows, merger);
        for (int i = 0; i < rows; i++)
        {
            new Summer(barrier, i).start();
        }
        System.out.println("Waiting...");
    }
}


Это сообщение отредактировал(а) jk1 - 17.9.2010, 20:55


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ораситель
Дата 18.9.2010, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



пипец, т.е. на винграде одни дибилы в джаве сидят ?  Потоки не знаете, господа ? 

Это сообщение отредактировал(а) Ораситель - 18.9.2010, 02:38
PM MAIL   Вверх
dobrolub
Дата 18.9.2010, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Цитата(Ораситель @ 17.9.2010,  14:22)
Цитата(kosmonaFFFt @  17.9.2010,  04:27 Найти цитируемый пост)
А при чем тут потоки? 

а есть другие варианты вызывать метод каждые 10 секунд после заверешения  работы предыдущего ?

Есть такие методы.
Код

public class T {
    public static void main(String []args) {
        int count = 10, i =0;
        T t = new T();
        while (i++ < count) {
            t.doIt();
            synchronized(t){
                try {
                    t.wait(10 * 1000);
                }catch (Exception e) {
                }
            }
        }
    }

    public void doIt() {
        System.out.println(new java.util.Date());
    }
}


Я не понимаю твоё описание задачи. Может и другие - тоже.

Это сообщение отредактировал(а) dobrolub - 18.9.2010, 03:02
PM   Вверх
Ораситель
Дата 18.9.2010, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.9.2010

Репутация: -1
Всего: -1



Цитата(dobrolub @  18.9.2010,  03:01 Найти цитируемый пост)
Ты задачу корректно поставь, а потом ерепенься. 

нужен бесконечный поток, в котором будет вызываться метод doIt()  столько раз, сколько я ему скажу

Это сообщение отредактировал(а) Ораситель - 18.9.2010, 03:04
PM MAIL   Вверх
dobrolub
Дата 18.9.2010, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



код, что вверху вызовет метод doIt 10 раз с интервалом 10 секунд из одного потока.
PM   Вверх
nc30
Дата 18.9.2010, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата(jk1 @ 17.9.2010,  18:55)
как насчет использования CyclicBarrier?
Интересный вариант, попробую разобраться  smile 

Цитата(Ораситель @ 17.9.2010,  17:39)
nc30, млин, чувак, создай свою тему.

Ораситель
Извини, дружище  smile  Сначала хотел только один момент уточнить (у Metal_Heart насчет join()), но чересчур увлекся. 
Переношу свой вопрос в новую тему  smile 



Это сообщение отредактировал(а) nc30 - 18.9.2010, 05:58
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.