簡體   English   中英

如何終止Java中的循環子線程?

[英]How should I terminate a looped sub-thread in Java?

當我要終止循環線程時,我需要做一些清理工作。 例如保存緩沖區,以便以后可以繼續。

PseudoCode: 
private class CalculatePI(Byte[] resume) implements Runnable{
    public void Run(){
       while(true){
          resume=resumeCalculating(resume);
       }
    }
}
Thread calculator= new Thread(new CalculatePI(Byte[] resume)); 
Thread.sleep(200); 
//And now I want to kill calculator

那么實現此目標的最佳方法是什么?

  1. 使用標志:但是問題是,如果resumeCalculating()需要花費時間(編輯:很長時間) 永遠 結束嗎?
  2. 將異常放入計算器中,怎么辦?
  3. 我可以使用事件監聽器嗎? 我以為它們用於GUI
  4. 停下來嗎 並且Class Thread包含某種解構函數,該函數在線程終止時會被調用,我可以在那里進行處理嗎?

所有者編輯:

我知道我可以使用標志。 但是考慮一下:

    public void Run(){
       while(true){
          resume=calculate_stepone(resume); //takes one minute
          resume=calculate_steptwo(resume); //takes two minutes
          resume=calculate_stepthree(resume); //takes three minutes
          resume=calculate_steplast(resume); //takes four minutes
       }
    }

正在放置一個if(flag) saveResultsAndExit(); 每行之間實用還是漂亮? 我只想丟棄經過半處理的結果,並保存以前的結果。

停止線程的正確方法是中斷它。

如果線程中運行的任務正在執行IO或正在使用sleep則它將接收到信號(此時為InterruptedException ); 否則,任務應定期輪詢以查看其是否中斷

讓我們修改原始海報的偽代碼:

private class CalculatePI(Byte[] resume) implements Runnable{
    public void Run(){
       while(!Thread.interrupted()) { //###
          resume=resumeCalculating(resume);
       }
    }
}
Thread calculator= new Thread(new CalculatePI(Byte[] resume)); 
calculator.run(); //###
//...
//And now I want to kill calculator
calculator.interrupt(); //### sends the signal
//...
calculator.join(); //### actually waits for it to finish

對1的回答:您也可以在resumeCalculating()處理中止標志。

最好使用一個標志,等待一段時間以使線程結束,如果沒有結束(resumeCalculating尚未返回),則手動終止該線程。 最好不要在簡歷計算中包含太多基於線程的邏輯,這實際上取決於實現方式以及中途中止操作的容易程度。

設計您的程序,以使resumeCalculation不會永遠花費下去。 另外,同步訪問您的標志。

暫無
暫無

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

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