2012-10-11 34 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

“搜索所有磁盘内容”的线程应该以能够及时中断它的方式实现。

相关问题