簡體   English   中英

線程中斷

[英]Thread interruption

所以我有一個關於java中線程的interrupt()方法的問題。 這是我的一段代碼:

threads.forEach(Thread::start);
threads.forEach(thread -> {
    try {
        thread.join();
        if (done){
            thread.interrupt();
        }
    } catch (InterruptedException e){
        e.printStackTrace();
    }
});

現在,如您所見,我首先啟動每個線程並加入它們。 我想知道的是“thread.interrupt()”是否按照我的想法行事。 我創建了一個可變的布爾值“完成”(默認情況下為 false)。 我在某處還有一段代碼,每個線程在其中搜索文件中的某些內容。 當找到某些東西時,我將布爾值 done 設置為 true。 我希望這會阻止所有其他尚未完成的線程運行。

然而,有些事情告訴我,這並不像我做的那么容易。 因此,如果有人能告訴我我所做的是否正確,我將不勝感激 - 如果不是 - 這究竟是做什么的。

我想知道的是“thread.interrupt()”是否按照我的想法行事。

不,它沒有。

假設您有兩個線程在文件中搜索某些內容。 當 thread2 發現它是什么,並將done設置為true ,主線程(您問題中的代碼)可能仍在等待 thread1 終止,因為您調用了thread.join(); 在線程1,而事實上threads.forEach不並行運行。

主線程將在thread1.join()thread1.join()直到 thread1 也發現了這個東西,或者在沒有找到任何東西的情況下結束,或者被第三個線程中斷。

為了實現你的意圖,你必須為你創建的每個線程維護所有其他線程的引用,並在任何一個線程第一次發現結果時中斷所有其他線程。

另一種方法是不要為每個線程調用 join ,而是忙於檢查 volatile 標志done ,並在done == true上中斷每個線程。

threads.forEach(Thread::start);
while (!done) {
    Thread.sleep(100);
}
threads.forEach(thread -> {
    try {
        thread.interrupt();
    } catch (InterruptedException e){
        e.printStackTrace();
    }
});

暫無
暫無

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

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