2015-04-01 58 views
0

當我試圖找出如何在多線程的程序停止一個線程,
suggested調用實際上設置一個標誌告訴線程停止做真正的作品,這樣的方法:爲什麼我們使用一個標誌來停止線程?

public class ThreadTobeTerminated implements Runnable { 

    private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class); 
    private volatile boolean running = true; 

    public void terminate() { 
     running = false; 
    } 

    @Override 
    public void run() { 
     while (running) { 
      try { 
       LOGGER.debug("Doing some real work ,like Counting..."); 
       for(int i=0;i<100;i++){} 

      } catch (InterruptedException e) { 
       LOGGER.error("Exception", e); 
       running = false; 
      } 
     } 

    } 
} 

當我想停止這個步伐時,我會打電話給threadInstance.terminate();

難道我不需要從字面上停止此線程嗎?

爲什麼我應該離開這個線程做一些無用的工作(調用方法run,測試標誌running==false然後返回)?我的意思是:這是浪費時間,不是嗎?

+1

作爲一種替代方法,您提出了什麼建議?仍然允許線程以*受控*方式停止,而不是通過操作中途停止,使系統處於不太明確的狀態? – 2015-04-01 13:56:25

回答

1

當執行範圍超出run()方法時,線程停止,所以當循環中斷時,線程將停止。

這也將讓你做一些清理,如果情況需要它:

public void run() { 
    while (running) { 
     try { 
      LOGGER.debug("Doing some real work ,like Counting..."); 
      for(int i=0;i<100;i++){} 

     } catch (InterruptedException e) { 
      LOGGER.error("Exception", e); 
      running = false; 
     }   
    } 
    //Clean up 
} 

上述方法可以讓你在如何是線程一些控制停止什麼,而不是潛在後會發生只是殺了它,這可能會導致各種問題。

相關問題