2012-10-11 32 views
3

我已經走過了許多關於停止線程的現有答案。我複製下面一段典型的代碼。如果我的工作人員沒有重複完成,我該如何停止一個線程?

public class HelloWorld { 

    public static void main(String[] args) throws Exception { 
     Thread thread = new Thread(new Runnable() { 

      public void run() { 
       try { 
        while (!Thread.interrupted()) { 
         Thread.sleep(5000); 
         System.out.println("Hello World!"); 
        } 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } 
      } 
     }); 
     thread.start(); 
     System.out.println("press any key to quit"); 
     System.in.read(); 
     thread.interrupt(); 
    } 
} 

但這種方法需要檢查在while循環中斷狀態code.If我在run方法我做的是一個連續的,單一路徑的事情,所以我沒有機會來檢查中斷狀態的兩倍。例如,我想停止搜索所有磁盤內容的線程,並且需要很長時間。

我該如何阻止它?

+2

*「我想停止搜索所有磁盤內容的線程」*並通過目錄將其切換到該目錄?如果它使用遞歸或迭代模式遍歷文件系統,那麼每次都有一個「繼續」標記被檢查的機會。 –

+0

是的,你是對的。但這僅僅是一個例子。如果它不能被放入循環代碼中,我該如何解決它?謝謝。 –

+1

*「但這只是一個例子。」*如果沒有說明前提條件,這是一個非常糟糕的例子。 –

回答

3

在你長時間運行的過程中,你必須有一些要點,你可以說if (!keepRunning) { break; } else { do next directory/file(); }擺脫循環。

在你的稻草人例子中,如果你正在搜索磁盤,那麼在你處理每個文件和目錄以包含這個檢查邏輯之前,你有點。

如果你有一個非常長的運行過程,比如加密一個巨大的文件,或者傳輸一個非常大的文件,你仍然可以將這些標誌檢查嵌入進程中。在這個例子中,你將傳輸字節塊,然後再構建每個塊,發送給你檢查標誌狀態。一切都必須在某個階段逐步完成,並且您可以在每個步驟之前將您的標誌簽入。我無法想象任何沒有階段或步驟的長時間運行,除了一個人爲的例子.sleep()或一些連接邏輯等待永遠發生的事情。

沒有確切您遇到它的問題將很難以更具體的方式回答您的問題。顯示一些你實際上遇到問題的代碼。

+0

+1爲'稻草人示例'。 ;)我覺得我們在這裏追逐自己的尾巴。 –

0

停止線程是不好的。線程應該自行停止(結束執行)。例如,您的主線程可以通過設置屬性來指示線程停止。

0

「搜索所有磁盤內容」的線程應該以能夠及時中斷它的方式實現。

相關問題