2015-04-01 63 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 
} 

上述方法可以让你在如何是线程一些控制停止什么,而不是潜在后会发生只是杀了它,这可能会导致各种问题。

相关问题