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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Готовое решение по распараллеливанию задач 
V
    Опции темы
Platon
Дата 24.7.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Здравствуйте, уважаемые.

Возникла потребность обработать N задач M потоками. Я слышал о готовом решении ThreadPoolExecutor, который почти подходит. Есть только проблема: необходимо чтоб на время выполнения этой массовой задачи, текущий поток остановился и по выполнении определенного числа задач возобновил работу.

Моё решение на скорую руку:

Код

class AmountExecutor extends ThreadPoolExecutor {

        private int tasksAmount;

        private AmountExecutor(int simulteniousJobs, int tasksAmount) {
            super(simulteniousJobs, simulteniousJobs, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(tasksAmount));
            this.tasksAmount = tasksAmount;
        }

        protected synchronized void afterExecute(Runnable r, Throwable t) {
            super.afterExecute(r, t);
            tasksAmount--;
            if (tasksAmount == 0) {
                notifyAll();
            }
        }
    }


Код запуска:

Код

        ThreadPoolExecutor threadPool = new AmountExecutor(simulteniousJobs, tasks.size());
        for (Runnable r : tasks)
            threadPool.execute(r);
        try {
            synchronized (threadPool) {
                threadPool.wait();
            }
            threadPool.shutdown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


В целом, и такое устроит. Но, как недавно вычитал, "наличие опыта не говорит о его ценности". Главное - знание. так вот хочется знать лучшее решение.

Это сообщение отредактировал(а) Platon - 24.7.2008, 13:50
PM MAIL ICQ   Вверх
ekr
Дата 24.7.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

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



Глянь почту.
Там не ответы, а направления, куда смотреть )


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
w1nd
Дата 24.7.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Platon, всё очень просто: у любого ExecutorService есть метод awaitTermination(). Создайте пул, запустите задачи, инициируйте завершение - ExecutorService.shutdown() - ожидайте упомянутым вызовом.

Это сообщение отредактировал(а) w1nd - 24.7.2008, 14:10


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



ekr, спасибо за чтиво! Давно хотел заняться параллельными процессами.
w1nd, примерно понял про инициирование завершения. Но для контроля надо проверить.

Код

protected void afterExecute(Runnable r, Throwable t) {
            super.afterExecute(r, t);
            synchronized (this) {
                tasksAmount--;
            }
            if (tasksAmount == 0) {
                shutdown();
            }
        }

PM MAIL ICQ   Вверх
Ulysses4j
Дата 24.7.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Platon, не могли бы переслать мне на почту, то, что вам ekr скинул?


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Platon
Дата 24.7.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Я вообще предлагаю erk выложить куда-нибудь.
PM MAIL ICQ   Вверх
soulman
Дата 26.9.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(w1nd @ 24.7.2008,  14:07)
Platon, всё очень просто: у любого ExecutorService есть метод awaitTermination(). Создайте пул, запустите задачи, инициируйте завершение - ExecutorService.shutdown() - ожидайте упомянутым вызовом.


Например так:
Код


ThreadPoolExecutor pool = new ThreadPoolExecutor(...);

....

pool.execute(task);
....

pool.shutdown();
try {
    while(!pool.awaitTermination(100, TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {
}

PM MAIL   Вверх
headzero
Дата 30.9.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Меня тоже интересует решение этой задачи? Вопрос решен или нет? Подскажите пожалуста окончательное решение: остаоновить работу пула  поток при достижении определенного числа задач в пуле и возобновить когда число задач уменьшется до заданого уровня.


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
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.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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