Управляемое событиями будущее — Пул потоков

#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. где на самом деле выполняется вызываемый объект?