2011-07-03 6 views
1

public void execute(Runnable command) ThreadPoolExecutor内からこのコマンドオブジェクトは、提出されたオブジェクトが含まれていますが、ラップされているようです。アクセス提出物</p> <p>

カスタムスレッドプールエグゼキュータ内から送信されたオブジェクトにアクセスするにはどうすればよいですか?あるいは、ThreadPoolExecutorのbefore/after/executeメソッドの中から、送信されたオブジェクトにアクセスしようとするのは良い考えではありませんか?

答えて

4

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です。購入して読むことをお勧めします。

+0

ありがとうございます、私はすでにsubmit(Runnableタスク、V結果)コールを使用しています。これは将来を返します。 threadpoolexecutor内でいくつかのロギングを実行しようとしています。具体的には、デバッグに役立つタスクが完了しました。もう一つのオプションは、将来のオブジェクトに対してget()をブロックすることですが、そのような単純なタスクのために私にポーリングするように思えます。特に、afterExecute()メソッドを見ると、いくつかのタスクが完了したことがわかります。 –

+0

編集された回答のバージョンを参照してください。役に立ったら嬉しいです。 – Bohemian

関連する問題