9

私は持っていCallable<String>ます。を介して定期的に実行し、callable の呼び出しScheduledExecutorService.scheduleAtFixedRate()によって返されたすべての文字列のリストを取得したいと考えています。.call()asは a (s のみ) をscheduleAtFixedRate取りません 。次の行に沿ってmy をラップするカスタムを展開する必要があります。CallableRunnableRunnableCallable

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 クラスがあるのだろうか?

4

1 に答える 1

0

上記で行っていることは、 Callable 実装を単なる別の通常のクラスとして扱っていることです。呼び出し可能オブジェクトを ThreadPool エグゼキュータに送信していません。Callable.call() の呼び出しは、ThreadPoolExecutor を利用しません。

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

ForkJoinPool は、JDK 7 の一部として試すことができるオプションの 1 つです。タスクをフォークし、ForkJoinTask を使用してそれらを結合します。これらは、タスクの状態とその結果を知るためのものです。

これを見ましたか : Using Callable to Return Results From Runnables

于 2013-03-08T20:06:12.773 に答える