2

Executorに送信された場合でも、ExecutorがFutureオブジェクトを実行しないようにしたいのですが。エグゼキュータを介して複数のスレッドを実行することはすべて正常に機能しますが、Callableのいずれかがブール値のTRUEを返したときにエグゼキュータを停止する必要があります。現在実行中のFutureが完了したことは問題ありませんが、残りを続行するのは時間の無駄です。

Set<Future<Boolean>> calculationSet = new HashSet<Future<Boolean>>();
threadPool = Executors.newFixedThreadPool(3);

int x = nextX();
int y = nextY();

do {
   Callable<Boolean> mathCalculation = new MathCalculation(x, y);
   Future<Boolean> futureAttempt = threadPool.submit(mathCalculation);
   calculationSet.add(futureAttempt);

   x = nextX();
   y = nextY();
} while (runSomeMore());

MathCalculationがCallableインターフェイスを実装し、そのcall()メソッドがブール値を返す場合。

セットが非常に大きくなり、マルチスレッドの状況のた​​めに明らかに機能しないため、各反復でcalculationSetを検索することはオプションではありません。これを達成する方法はありますか?

4

2 に答える 2

2

ExecutorCompletionServiceを使用することもできます

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

このJavaDocの上部には2つの例があり、2番目の例は次のように述べています。

...一連のタスクの最初のnull以外の結果を使用し、例外が発生したものを無視し、最初のタスクの準備ができたら他のすべてのタスクをキャンセルするとします:」、その後にサンプルコードが続きます。

サントは非常に有望に聞こえますが、それはあなたの問題を解決しますか?

于 2011-02-09T22:01:22.637 に答える
0

Callableでエグゼキュータサービスを停止する場合は、ラッパーを作成するか、Callableを変更して停止することをお勧めします。

// performs a threadPool.shutdownNow() as required.
new MathCalculation(x, y, threadPool) 
于 2011-02-09T17:48:19.557 に答える