execute
を使用しないでください。submit
を使用してください。これは、タスクのハンドルであるFuture
を返します。あなたが直接タスクにアクセスすることはできませんが
ExecutorService service = Executors.newCachedThreadPool();
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
return "hello world";
}
};
Future<String> future = service.submit(task);
、あなたはまだそれと対話することができます:ここではいくつかのサンプルコードです
future.cancel(); // Won't start task if not already started
String result = future.get(); // blocks until thread has finished calling task.call() and returns result
future.isDone(); // true if complete
ます。また、サービスと対話することができます
service.shutdown(); //etc
コメントに組み込まれました:
あなたがうまくいけばtは、いくつかのロギングを行うには、次のように、afterExecute()
メソッドをオーバーライドするanonymous classを使用します。
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1)) {
@Override
protected void afterExecute(Runnable r, Throwable t)
{
// Do some logging here
super.afterExecute(r, t);
}
};
オーバーライド他の方法、必要に応じ。
クイックプラグ:IMHO、この件に関する聖書はJava Concurrency in Practiceです。購入して読むことをお勧めします。
ありがとうございます、私はすでにsubmit(Runnableタスク、V結果)コールを使用しています。これは将来を返します。 threadpoolexecutor内でいくつかのロギングを実行しようとしています。具体的には、デバッグに役立つタスクが完了しました。もう一つのオプションは、将来のオブジェクトに対してget()をブロックすることですが、そのような単純なタスクのために私にポーリングするように思えます。特に、afterExecute()メソッドを見ると、いくつかのタスクが完了したことがわかります。 –
編集された回答のバージョンを参照してください。役に立ったら嬉しいです。 – Bohemian