Event Driven Future <V>- Пул потоков - PullRequest
4 голосов
/ 23 октября 2011

Мы используем 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 */
}

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Вы можете захотеть проверить метод ThreadPoolExecutor.afterExecute () . он вызывается после завершения каждой задачи. Вы можете создать собственный подкласс ThreadPoolExecutor, который имеет желаемое поведение обратного вызова на основе событий.

0 голосов
/ 23 октября 2011

Вы можете легко создать шаблон, управляемый событиями. Следующий псевдокод иллюстрирует один подход.

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();
...