9

私は実行者サービスにまったく慣れていません。自分ですべてをやるのが好きでしたが、これらのサービスを信頼する時が来たと思います。

で手渡したいExecuterですRunnable。実行者はそれをaでラップし、FutureTaskそれを私に返します。ここで、polldone()メソッドを呼び出します。done()しかし、メソッドがtrueを返すときに通知を受け取りたいと思います。

get()が終了するまでブロックするメソッドがありますが、Runnableそれから、それがいつ終了するかを確認するために、すべてのジョブに追加のスレッドが必要になります。

Callableタスクの終了について通知を受け取るために、実行者に追加の情報を渡すことはできますか?

ここに行く方法は何ですか?runメソッドの最後にコードを追加することはできますが、done()それでもfalseになる可能性があります...

4

4 に答える 4

5

ExecutorCompletionService

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

于 2011-06-14T16:42:53.363 に答える
3

次々にタスクを実行したい場合は、同じスレッドで実行することをお勧めします。

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

このようにして、同じスレッドで実行可能になった後に実行したいことをすべて実行し、別のスレッドをポーリングしたり使用したりする必要はありません。

于 2011-06-14T16:41:40.273 に答える
3

Guavaのcom.google.common.util.concurrentパッケージ、特にListenableFutureタイプとそれに関連するコードを確認することをお勧めします。

次のリリース(r10)がリリースされると、MoreExecutors.listeningDecorator(ExecutorService)を使用してsをExecutorService返すを簡単に作成できます。現在、自分でs/ sをListenableFutureTaskでラップすることもできます。ListenableFutureRunnableCallable

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
于 2011-06-14T16:45:23.930 に答える
1

java.util.concurrent.ThreadPoolExecutorを使用するという特定の仮定を立てることができる場合は、そのフックメソッドを使用できます。afterExecute()およびbeforeExecute()。

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

これらはListenableFutureほどエレガントではありませんが、特定のエグゼキュータインスタンスに必要な「リスナー」のタイプが1つだけであれば、適切なソリューションになる可能性があります。

于 2011-06-14T19:42:16.697 に答える