Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Готовое решение по распараллеливанию задач


Автор: Platon 24.7.2008, 11:58
Здравствуйте, уважаемые.

Возникла потребность обработать 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();
        }


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

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

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

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

Код

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

Автор: Ulysses4j 24.7.2008, 15:08
Platon, не могли бы переслать мне на почту, то, что вам ekr скинул?

Автор: Platon 24.7.2008, 15:22
Я вообще предлагаю erk выложить куда-нибудь.

Автор: soulman 26.9.2008, 00:23
Цитата(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) {
}

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)