Skip to content
TopicTracker
出典 HackerNews原文を表示
翻訳言語翻訳言語

Java ExecutorServiceをデッドロックさせる方法

JavaのExecutorServiceを使う際、タスク内で別のタスクを送信してその結果を待つとデッドロックが発生する可能性があります。特にスレッドプールのサイズが限られている場合、親タスクが子タスクの完了を待っている間にスレッドを占有し続けるため、デッドロックが発生します。この記事ではその具体的なパターンと回避策を解説します。

背景メモ

- JavaのExecutorServiceは、スレッドプール内でタスクを非同期実行する標準API。開発者はタスク投入用のスレッドと、タスクを実際に実行するワーカースレッドを分離できる。 - 本記事が指摘するデッドロックは、限られた数のワーカースレッドを持つExecutorServiceに、あるタスクが別のタスクをsubmitする依存関係がある場合に発生する。内部タスクがワーカースレッドを待つが、外部タスクがそのスレッドを占有したまま解放しないため、互いに待ち合う状態になる。 - この問題は「スレッドプールの枯渇」とも呼ばれ、並行処理の教科書的な落とし穴。シングルスレッドのExecutor(newSingleThreadExecutor)や固定サイズプールで顕著に起こる。 - Java標準のForkJoinPoolや、Kotlinのcoroutineなど代替手段ではこの問題が起こりにくい設計になっているものもある。