質問

私は執行者サービスを初めて使用しています。自分ですべてをするのが好きでしたが、これらのサービスを信頼する時が来たと思います。

手を渡したいです Executer a Runnable. 。執行者はそれをラップします FutureTask そしてそれを私に返します。今、私は世論調査を呼びます done() 方法。しかし、そのときに通知されたいと思います done() メソッドはtrueを返します。

があります get() までブロックする方法 Runnable 終了しましたが、その後、すべてのジョブに追加のスレッドが必要になります。

エグゼキューに余分に渡すことはできますか Callable タスクの仕上げについて通知されるには?

ここに行く方法は何ですか?最後にコードを追加できました run 方法ですが、その後 done() まだ間違っているかもしれません...

役に立ちましたか?

解決

java.util.concurrent.threadpoolexecutorを使用するという特定の仮定を作成できる場合は、そのフックメソッドを使用できます。 afterexecute()およびbeforeexecute()。

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/threadpoolexecutor.html

リスニング可能な顧客ほどエレガントではありませんが、特定のエグゼクティブインスタンスには「リスナー」のタイプが1つだけ必要な場合、適切なソリューションである可能性があります。

他のヒント

次々と、同じスレッドでそれを行う方が良いタスクを実行したい場合。

Executor executor =
final Runnable runnable = 
executor.execute(new Runnable() {
    public void run() {
         runnable.run();
         // do something after the run() has finished.
    }
 });

このようにして、同じスレッドで実行可能な後にやりたいことは何でも実行し、別のスレッドを投票したり使用したりする必要はありません。

を見ることをお勧めします com.google.common.util.concurrent パッケージイン グアバ, 、具体的には 聞き取り可能なフチュール タイプとそれに関連するコード。

次のリリース(R10)が出たら、簡単に作成できます ExecutorService それは戻ります ListenableFutures使用 moreexecutors.listeningdecorator(executorservice). 。現在、包むこともできます RunnableS/Callables 聞き取り可能なFutureTask あなた自身。

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top