Java Callable FutureTask Excecuter:完成したタスクを聴く方法
-
27-10-2019 - |
質問
私は執行者サービスを初めて使用しています。自分ですべてをするのが好きでしたが、これらのサービスを信頼する時が来たと思います。
手を渡したいです 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つだけ必要な場合、適切なソリューションである可能性があります。
他のヒント
ExecutorCompletionservice
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/executorcompletionservice.html
次々と、同じスレッドでそれを行う方が良いタスクを実行したい場合。
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
それは戻ります ListenableFuture
s使用 moreexecutors.listeningdecorator(executorservice). 。現在、包むこともできます Runnable
S/Callable
s 聞き取り可能なFutureTask あなた自身。
final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
public void run() {
// do whatever
}
}, listenerExecutor);