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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запустить несколько потоков и подождать, когда все они остановлятся 
V
    Опции темы
integral
Дата 15.6.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



Всем добрый вечер!
пишу такой код:
Код

                final int count = 5;
        Thread[] t = new Thread[count];
        for(int i = 0; i < count; i++){
            t[i] = new Thread(new Runnable(){
                public void run(){
                    for(int j = 0; j < Integer.MAX_VALUE/10; j++);
                    System.out.println( Thread.currentThread().getName() );
                }
            });
            t[i].setName("#"+i);
            t[i].start();
        }
        for(int i = 0; i < count; i++){
            t[i].join();
        }

Идея: запускаем Н потоков, затем в главном потоке (запустившем их) ждем покуда они все закончат выполнение. 
В данной реализации стартуем все потоки, затем присоеденяем их. По идее, должно срабатывать как хочется (см. пункт идея). Но есть сомнения: будет ли это работать правильно всегда?


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
Fieral
Дата 15.6.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а что за метод "join"?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Vitaly333
Дата 15.6.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Цитата

Но есть сомнения: будет ли это работать правильно всегда? 

Думаю, что будет, но лучше использовать защёлку.
Примерно так:

Код

final int count = 5;
        Thread[] t = new Thread[count];
CountDownLatch cdl = new CountDownLatch(count); // создается объект - защёлка c внутренним счётчиком = 5
        for(int i = 0; i < count; i++){
            t[i] = new Thread(new Runnable(){
                public void run(){
                    for(int j = 0; j < Integer.MAX_VALUE/10; j++);
                    System.out.println( Thread.currentThread().getName() );
                    cdl.countDown(); // уменьшаем счетчик на 1
                }
            });
            t[i].setName("#"+i);
            t[i].start();
        }

       try{
    // защёлка блокирует тек. поток
   //  когда внутренний счётчик защёлки обнулится она "откроется"
         cdl.await(); 
        }catch(InterruptedException ignored){}


PM MAIL   Вверх
NeoNYura
Дата 15.6.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А еще лучше использовать пул потоков (executor), будет еще красивее =)
PM MAIL   Вверх
integral
Дата 16.6.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



Цитата(Fieral @  15.6.2009,  18:37 Найти цитируемый пост)
а что за метод "join"? 

обычный join http://java.sun.com/j2se/1.5.0/docs/api/ja...ead.html#join()




Цитата(Vitaly333 @  15.6.2009,  21:42 Найти цитируемый пост)
Думаю, что будет, но лучше использовать защёлку.
Примерно так:

аха, пасиба, идея с вызовов notify понятна)


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
brrr09
Дата 9.8.2010, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чтобы не создавать новую тему, решил поднять эту (задача аналогичная, почтиsmile). Допустим есть некоторый класс...

Код

public class BTP extends Thread {

public static int     START = 1;
public static int     END   = 1;
    
    public BTP(int Start, int End){
        START = Start;
        END   = End;
    }
    
    public void run() {
        
        System.out.println(getName());
        for (int i=START; i<END; i++) {
            try {
                FileWriter FW = new FileWriter(getName().substring(getName().indexOf("-")+1)+".txt",true);
                FW.write(i+"\r\n");
                FW.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(getName()+" - END");  
            
    }
}


Запускаю его

Код

ExecutorService ES = Executors.newFixedThreadPool(20);

for (int j=1; j<=20; j++) {
      ES.execute( new BTP((j*25)-(25), j*(25)));
 }


Ожидаемый результат (на мой взгляд), что в файле 1.тхт будут записаны числа от 0 до 24, в 2.тхт от 25 до 49 etc. (и это все будет сделано параллельно). Однако взамен этого, во все файлы записывается содержимое "планового" последнего файла, или вообще хаос. С потоками, можно сказать раньше не работал, вот решил потестировать. Буду благодарен за любую критику) или информацию, в какую сторону копать.(если в правописании есть орфографические ошибки, извините, так как родной язык украинский).
PM MAIL   Вверх
jk1
Дата 9.8.2010, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Дело тут вот в чем
Код

public static int  START = 1;
public static int  END   = 1;

а статика как известно является атрибутом класса, а не объекта. Проще говоря, на все объекты BTP есть только один  START и один END. Вполне естественно, что в них остается результат последнего присваивания. Лечится так:
Код

public int START = 1;
public int END = 1;

И, пожалуйста, начните в следующий раз новую тему для нового вопроса, ибо правила форума

Это сообщение отредактировал(а) jk1 - 9.8.2010, 07:50


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


Новичок



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

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



Цитата(jk1 @  9.8.2010,  07:45 Найти цитируемый пост)
статика как известно является атрибутом класса, а не объекта. Проще говоря, на все объекты BTP есть только один  START и один END. Вполне естественно, что в них остается результат последнего присваивания.

Cпасибо, не знал.

Цитата(jk1 @  9.8.2010,  07:45 Найти цитируемый пост)
И, пожалуйста, начните в следующий раз новую тему для нового вопроса, ибо правила форума

Исправлюсь. Еще раз, спасибо за помощь.

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

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

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


 




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


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

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