1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個贊
您正在使用標(biāo)志isConsumerInterrupted來終止生產(chǎn)者線程。這是錯誤的。消費(fèi)者不會消耗隊(duì)列中的元素,而生產(chǎn)者會持續(xù)生產(chǎn)直到隊(duì)列已滿,然后開始阻塞,直到隊(duì)列未滿。然后,當(dāng)消費(fèi)者拋出 RuntimeException 時,它會設(shè)置該標(biāo)志,并且生產(chǎn)者線程沒有機(jī)會檢查該標(biāo)志,因?yàn)闆]有消費(fèi)者消耗隊(duì)列中的元素,以便生產(chǎn)者可以擺脫等待狀態(tài)。一種選擇是使用 future 并在消費(fèi)者拋出與設(shè)置標(biāo)志相反的異常時取消它。由于它processQueue.put響應(yīng)中斷,因此它將成功終止生產(chǎn)者線程。InterruptedException如果在等待期間被中斷,則會拋出An 。它看起來是這樣的。
private static Future<?> producerFuture = null;
public static void main(String[] args) {
// Remainder omitted.
producerFuture = producerPool.submit(new ServiceClass(false, false));
// ...
}
private void consume() {
try {
// ...
} catch (Exception e) {
producerFuture.cancel(true);
}
}
添加回答
舉報(bào)