2012-11-26 6 views
8

私にはCallable<String>があります。私は定期的にScheduledExecutorService.scheduleAtFixedRate()経由でそれを実行し、呼び出し可能な呼び出しの.call()呼び出しによって返されたすべての文字列のリストを取得したいと思います。 scheduleAtFixedRateとして、私はこれらの線に沿って私のCallableをラップするカスタムRunnable、何かを展開する必要がCallable(のみRunnable複数可)を取ることはありません。当然のことながら定期的にCallableをScheduledExecutorService経由で実行しています

final Callable<String> myCallable = ....; 
final ConcurrentLinkedQueue<String> results 
    = new ConcurrentLinkedQueue<String>(); 

Runnable r = new Runnable() { 
    @Override public void run() { 
    try { 
     results.add(myCallable.call()); 
    } catch (Exception e) { 
     results.add(null); // Assuming I want to know that an invocation failed 
    } 
    } 
}; 

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS); 

、私は自分のカスタムを展開避けたいのですが(特にマルチスレッドコードの場合)、この種の集約を行うJDKクラスがあるのだろうか?

+0

いいえ、あなたのためのコレクションに呼び出し可能な結果を​​置くために、JDKの既存のユーティリティはありません。 – jtahlborn

+0

それは私が思ったことです。ありがとう。 –

答えて

0

あなたはCallable実装をもう一つの通常のクラスとして扱います。呼び出し可能オブジェクトをThreadPoolエグゼキュータに送信していません。 Callable.call()を呼び出すと、ThreadPoolExecutorは使用されません。

スレッドプーリングを利用するには、タスク(Runnable/Callable/ForkJoinTaskなど)をThreadPoolに送信する必要があります。 Futuresを使用して、一度実行した結果を収集することができます。

ForkJoinPoolは、JDK 7の一部を試すことのできる1つのオプションです。タスクをフォークし、ForkJoinTaskを使用してそれらに参加させてください。 Futuresを使用してみませんか?タスクの状態とその結果を知るためのものです。

あなたがこれを見ていました:Using Callable to Return Results From Runnables

関連する問題