[英]ArrayBlockingQueue - How to “interrupt” a thread that is wating on .take() method
我在代碼中使用ArrayBlockingQueue
。 客戶將等待,直到某個元素可用:
myBlockingQueue.take();
萬一隊列中沒有任何元素並且take()
無限期地等待某個元素變得可用,我該如何“關閉”我的服務? 此方法引發InterruptedException
。 我的問題是,如何才能“引發”一個中斷異常,以便take()
退出? (我也對notify()
懷疑,但似乎我對此沒有幫助。)
我知道我可以插入特殊的“ EOF / QUIT”標記元素,但這真的是唯一的解決方案嗎?
UPDATE (關於注釋,它指向具有兩個解決方案的另一個問題):
上面提到的一個使用“中毒葯丸對象”,第二個是Thread.interrupt()
:
該myBlockingQueue.take()
不使用的Thread
(擴展Thread),而是實現Runnable
。 似乎Runnable不提供.interrupt()
方法?
如何中斷Runnable
?
您可以像這樣實現Runnable。 (假定您在嘗試中斷它之前已經啟動了Runnable)
class MyRunnable implements Runnable {
private Thread thisThread;
public void run() {
thisThread = Thread.currentThread();
try {
// do some work
} catch(Throwable t) {
t.printStackTrace(); // or log the error.
}
}
public void interrupt() {
thisThread.interrupt();
}
}
直接的方法是保留用於運行可運行線程並在關閉時中斷它的線程的引用。
或者,您可以使用線程池來組織服務的線程。 然后,線程池負責跟蹤和管理線程,包括在關閉線程時將其中斷。
還有另一種(不建議使用的但不推薦的方法)方式是枚舉JVM中所有正在運行的線程(使用ThreadGroup的方法),並嘗試猜測哪個線程運行了您的可運行線程(例如,通過分析每個線程的堆棧)。
找到了解決方案:
可以按照問題“毒物”中的描述使用
要么
使用this.interrupt()
中斷線程eitehr,或者如果它是可運行的,則使用Thread.currentThread().interrupt();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.