終了するはずのスレッドがありますが、それはしませんでした。Java - Executors.newFixedThreadPoolで実行されたスレッドは決して終了しません。
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: not available
AbstractQueuedSynchronizer$ConditionObject.await() line: not available
LinkedBlockingQueue<E>.take() line: not available
ThreadPoolExecutor.getTask() line: not available
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: not available
ThreadPoolExecutor$Worker.run() line: not available
Thread.run() line: not available
コード::私も代わりCountDownLatch
のSemaphor
を使用しようとしましたが、同じ結果を持っていた
ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
int totalNumberOfTasks = 0;
for(int i = 0; i < size; i++) {
if(expr != null) {
totalNumberOfTasks++;
threadExecutor.execute(new Runnable() {
@Override
public void run() {
doSmth();
}
});
}
}
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
(デバッガで確認)各スレッドでのスタックトレースがあります。誰かが私を助けることができますか?あなたが事前にタスクの数がわからない場合、あなたはinvokeAll
を使用することができ
ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// Must be available in Runnables
final CountDownLatch latch = new CountDownLatch(size);
int totalNumberOfTasks = 0;
for(int i = 0; i < size; i++) {
if(expr != null) {
totalNumberOfTasks++;
threadExecutor.execute(new Runnable() {
@Override
public void run() {
doSmth();
latch.countDown(); // Countdown the latch
}
});
}
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
:
あなたは、ラッチをカウントダウンされていません...ので、あなたは永遠に待ちます。完全に期待される結果。 – Fildor
はい、あります。しかし、おそらく 'CountDownLatch'は私の場合、タスクの数があらかじめ定義されていないときは役に立ちません。 'セマフォ'を 'Runnable'の中でどのように使うべきですか? – Ivan
私の編集した答えを見てください。 – Fildor