簡體   English   中英

Java 一般意義上的線程中斷

[英]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
        }
    }
}

現在的問題是:如何向被中斷的線程發出特定的請求?

我如何將我的請求傳達給被中斷的線程,就好像要停止、暫停或做其他任何事情一樣?

想法:

  • 將 InterruptedException 子類化為 InterruptedExceptionStop 和 InterruptedExceptionPause(不知道如何拋出它們)
  • 創建一個包含請求的單獨 object。 不知道在不使事情過於復雜的情況下實現這一目標的最佳方法是什么
  • 其他?
  1. 是的,正如@markspace 在評論中所說,沒有任何實際理由要求線程隨時執行暫停/恢復/等操作(?)。

線程只是一般意義上的計算,而不是一個單一的有時間限制的工作。 您知道,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 ”在語義上是司空見慣的。

反對該方法的另一個可能的論點主要是架構上的。 RunnableCallable是 IoC(控制反轉)模式的示例。 但是我們在其中引入了控制/執行管理方法,這有點 IMO 的味道。

如果您已經解釋了您要解決的具體問題是什么,我們會建議一種比RunnablePausable方法更合適、更慣用的方法。

  1. 現在,我為什么喜歡這個問題。 當開發人員如此深入地思考他們的事情時,這對我很有啟發。 他們發明一些東西很好,即使這些是他們自己自制的延續和調度程序:) 這可能是一個有啟發性的游戲/實驗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM