shutdownNow()
保留中のタスクで実行を中止できるのは正しいです。あなたの目標が結果を計算するのに十分なだけの作業を行うことであり (これには未定の数のタスクが必要です)、結果が得られたらすぐにそれ以上の作業をやめる場合、Runnable
オブジェクトがループを停止する必要があることをループします。何かのようなもの:
ExecutorService svc = ...
AtomicBoolean done = new AtomicBoolean();
for (int i=0; i < jobs.length; i++) {
svc.submit(new MyRunnable(done, jobs[i]));
if (done.get()) break;
}
class MyRunnable implements Runnable {
private final Whatever job;
private final AtomicBoolean done;
MyRunnable (AtomicBoolean done, Whatever job) { this.done = done; this.job = job; }
public void run() {
if (done).get() return;
//do the work
if (somehowComputeThatTheWorkIsComplete) done.set(true);
}
}
あまりにも多くのスレッドが起動されているためにハングアップしている場合は、 Executors.newFixedThreadPool()の使用を検討してください。コンピューターは、実際には、利用可能な論理コアの数よりも多くの作業を同時に行うことはできません。そのため、無制限のスレッド プール (Integer.MAX_VALUE
スレッドまで作成可能) を使用しても、実際には同時実行性が向上しないため、役に立ちません。エグゼキューターを妥当な数のスレッドに制限するだけで、「ハング」タイプの問題はおそらくなくなるでしょう。