1 回答

TA貢獻1824條經(jīng)驗 獲得超6個贊
您正在使用標志isConsumerInterrupted來終止生產(chǎn)者線程。這是錯誤的。消費者不會消耗隊列中的元素,而生產(chǎn)者會持續(xù)生產(chǎn)直到隊列已滿,然后開始阻塞,直到隊列未滿。然后,當消費者拋出 RuntimeException 時,它會設置該標志,并且生產(chǎn)者線程沒有機會檢查該標志,因為沒有消費者消耗隊列中的元素,以便生產(chǎn)者可以擺脫等待狀態(tài)。一種選擇是使用 future 并在消費者拋出與設置標志相反的異常時取消它。由于它processQueue.put響應中斷,因此它將成功終止生產(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);
}
}
添加回答
舉報