1

当我要终止循环线程时,我需要做一些清理工作。比如保存一个缓冲区,这样我以后可以继续。

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();实用还是漂亮?我只想扔掉半处理的结果,并保存以前的结果。

4

4 回答 4

5

停止线程的正确方法是中断它。

如果线程中运行的任务正在执行 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
于 2010-02-23T11:43:56.633 回答
0

对1的回答:您也可以处理中止标志resumeCalculating()

于 2010-02-23T11:37:55.087 回答
0

最好使用一个标志,等待一段时间让线程结束,如果没有(resumeCalculating 没有返回)手动终止线程。最好不要在 resumeCalculating 中涉及太多基于线程的逻辑,这实际上取决于它是如何实现的,以及在操作中途中止的难易程度。

于 2010-02-23T11:38:10.750 回答
0

设计你的程序,这样 resumeCalculating 就不会永远继续下去。此外,同步访问您的标志。

于 2010-02-23T11:39:00.773 回答