[英]Java Thread Interruption in a general sense
暫停線程的最推薦方法之一是通過添加 pause() 方法來擴展 Runnable 接口:
interface RunnablePausable extends Runnable {
public void pause();
}
這對我來說從來沒有意義,因為您實際上並不想暫停可運行但運行它的線程,就像您啟動/中斷線程而不是可運行一樣。
一種更優雅的方法:由於 interrupt() 功能是內置的並且受到多種方法的支持,如果我們 interrupt() 線程不僅僅是為了終止它,而是為了一般請求(就像你會中斷 CPU,在某種方式)? 然后讓 Runnable 處理這個特定的請求
舉個例子:interrupt() 線程,而不是直接終止它,而是處理它的請求以暫停、停止、恢復或做任何你喜歡的事情。
不確定這是否有意義。
像這樣的東西:
public void run() {
try {
//...
} catch (InterruptedException ie) { //interrupted
if (i_wanted_to_pause) { //manage request
//wait
}
if (i_wanted_to_stop) {
//return
}
if (any_other_request) {
//handle it
}
}
}
和:
public void run() {
if (Thread.currentThread().isInterrupted()) { //interrupted
if (request_to_pause) { //manage request
//wait
}
if (request_to_stop) {
//return
}
if (any_request) {
//handle it
}
}
}
現在的問題是:如何向被中斷的線程發出特定的請求?
我如何將我的請求傳達給被中斷的線程,就好像要停止、暫停或做其他任何事情一樣?
想法:
線程只是一般意義上的計算,而不是一個單一的有時間限制的工作。 您知道,CPU 密集型執行有以下流行模式:
ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
這意味着a thread ~= a CPU core
。 在此處將線程視為 CPU 核心。 我相信這是一種慣用的觀點——一種長期存在的順序計算,一種傳送器。 您認為應該有一種方法可以讓用戶pause
CPU 內核嗎? 通過粘在每個盒子上的按鈕來停止傳送帶? 我不這么認為。 因此,如果您想阻止 CPU 進行計算,請不要要求它進行計算。 一個經典的例子 - 使用線程和 BlockingQueue 烘焙的作業/任務隊列。 您將計算拆分為多個作業以將它們消耗到隊列中。 如果您不使用新的(可選地清除隊列),您的線程自然會在take()
上“暫停”。 IO 也是如此,直到您可以使用完全無阻塞的解決方案來刻錄 CPU。 使用您的代碼,您還必須注意您在 run() 中使用的第 3 方事物/對象,以免它們在中斷后意外損壞,因為“ interruption == termination
”在語義上是司空見慣的。
反對該方法的另一個可能的論點主要是架構上的。 Runnable
、 Callable
是 IoC(控制反轉)模式的示例。 但是我們在其中引入了控制/執行管理方法,這有點 IMO 的味道。
如果您已經解釋了您要解決的具體問題是什么,我們會建議一種比RunnablePausable
方法更合適、更慣用的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.