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


Автор: ochnev 13.5.2009, 12:14
Хотелось бы узнать, существует ли готовая реализация такой задачи.

Thread pool, работающий подобно пулу, получаемому таким методом:
java.util.concurrent.Executors.newFixedThreadPool(int nThreads)

В него добавляются задачи, в виде, похожем на интерфейс java.util.Future или java.util.Callable:
Код

pool.addTask("task 1", someTask);
pool.addTask("task 2", otherTask);


А потом эти задачи чтобы можно чтобы было проверять:
Код

boolean completed = pool.isTaskCompleted("task 1");
if(completed) {
   SomeResulType result = pool.getTaskResult("task 1"); // тип результата - через шаблонный класс
   // использовать result
   // ...
}


То есть в пользовательском интерфейсе нажимаем кнопку, список задач запускается на выполнение, и пользователь видит список и статус каждой задачи.

Более продвинутый вариант:
К пулу присоединяется некий event listener, и при окончании (или при прекращении по таймауту) какой-нибудь задачи можно обновлять пользовательский интерфейс и показывать там новый отчёт о состоянии всех задач.

Есть какая-нибудь реализация этого уже? Хотя бы не в продвинутом варианте.

Автор: COVD 13.5.2009, 15:48
Цитата

К пулу присоединяется некий event listener, и при окончании (или при прекращении по таймауту) какой-нибудь задачи можно обновлять пользовательский интерфейс и показывать там новый отчёт о состоянии всех задач.

К пулу не надо ничего прикреплять. Это задачи должны при изменении своего статуса  генерировать события и ставить их в общую очередь (например, java.util.concurrent.LinkedBlockingQueue). А отдельный поток по одному их из очереди извлекает и передает интерфейсу для обновления. Интерфейс же обновляется в потоке EDT - EventDispatchThread. 

Автор: LSD 14.5.2009, 15:24
Посмотри класс SwingWorker.



Цитата(COVD @  13.5.2009,  15:48 Найти цитируемый пост)
Это задачи должны при изменении своего статуса  генерировать события и ставить их в общую очередь (например, java.util.concurrent.LinkedBlockingQueue). А отдельный поток по одному их из очереди извлекает и передает интерфейсу для обновления. Интерфейс же обновляется в потоке EDT - EventDispatchThread.

Такие сложности нужны, если происходит очень много обновлений за одну секунду. А так можно просто из таска менять модель.

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