#java #multithreading #callable
#java #многопоточность #вызываемый
Вопрос:
Мы используем callable<V>
и Future<V>
для получения результата завершенного потока из пула потоков. Мы должны позвонить get()
, чтобы получить возвращенный результат. Моя проблема в том, что она не управляется событиями. Есть ли какая-либо основа для получения результата, подобного SIGCHLD
для дочерних процессов в C? Я хочу что-то вроде этого: (пул потоков вызовет эту функцию, когда каждый поток в пуле завершит задание)
public void fetchResult(Thread t, Runnable r, Future<Integer> result) {
Integer x = result.get();
/* handle x */
/* also we have Thread and Runnable object that has terminated */
}
Комментарии:
1. Не могли бы вы выразить это подробнее? До сих пор не ясно, чего именно вы хотите
2. Какая часть «управляемого событиями» важна для вас? Я предполагаю, что это не отсутствие ожидания занятости, поскольку Future.get() не выполняет ожидание занятости.
3. @Avi: Он не занят-подождите, но он блокируется. Я не хочу запираться. Я хочу, чтобы основной поток выполнил какую-то работу. когда поток из пула завершается, пул вызывает функцию, и в этой функции, когда я вызываю
Future.get()
ее, она немедленно возвращается.
Ответ №1:
возможно, вы захотите проверить метод ThreadPoolExecutor.afterExecute() . он вызывается после завершения каждой задачи. вы могли бы создать пользовательский подкласс ThreadPoolExecutor, который имеет желаемое поведение обратного вызова на основе событий.
Ответ №2:
Вы могли бы легко создать шаблон, управляемый событиями. Следующий псевдокод иллюстрирует один подход.
abstract class EventTemplate<T> implements Runnable {
private BlockingQueue<T> queue;
public void submit(Callable<T> callable) {
queue.add(callable);
}
public abstract void handleEvent(T t);
public void run() {
for(;;) handleEvent(queue.take());
}
public void start() {
new Thread(this).start();
}
}
Классы могут расширять шаблон
class FooEventHandler extends EventTemplate<Foo> {
public void handleEvent(Foo foo) {
// do something
}
}
Который может быть создан
new FooEventHandler().start();
Комментарии:
1. где на самом деле выполняется вызываемый объект?