4

callable<V>およびを使用しFuture<V>て、スレッド プールから終了したスレッドの結果を受け取ります。get()返された結果を受け取るために呼び出す必要があります。私の問題は次のとおりです。イベント駆動型ではありません。SIGCHLDC の子プロセスのように結果を取得するフレームワークはありますか? 私はこのようなものが欲しい:(プール内の各スレッドがジョブを終了すると、スレッドプールはこの関数を呼び出します)

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 */
}
4

2 に答える 2

1

ThreadPoolExecutor.afterExecute()メソッドを確認することをお勧めします。各タスクの完了後に呼び出されます。必要なイベント ベースのコールバック動作を持つ ThreadPoolExecutor のカスタム サブクラスを作成できます。

于 2011-10-28T18:58:59.700 に答える
0

イベント駆動型のテンプレートを簡単に作成できます。次の疑似コードは、1 つのアプローチを示しています。

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();
于 2011-10-23T18:04:46.687 に答える