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循环代码中检查中断状态。如果我在run方法中做的是顺序单路径的事情所以我没有机会检查两次中断状态。例如,我想停止一个正在搜索所有磁盘内容的线程,它需要很多时间。

我怎样才能阻止它?

4

3 回答 3

3

在您长期运行的过程中,您必须有一些可以说if (!keepRunning) { break; } else { do next directory/file(); }要跳出循环的点。

在您的稻草人示例中,如果您正在搜索磁盘,则在处理每个文件和目录以包含此检查逻辑之前,您会在其中找到一些点。

如果你有一个运行时间很长的进程,比如加密一个巨大的文件,或者传输一个非常大的文件,你仍然可以将这些标志检查嵌入到进程中。在此示例中,您将传输字节块,在构建每个要发送的块之前,您将检查标志条件。在某些时候,一切都必须分步完成,您可以在每个步骤之前签入您的标志。.sleep()除了一个人为的例子或一些永远等待某事发生的连接逻辑之外,我想不出任何没有长期运行的阶段或步骤的东西。

如果没有您遇到的确切问题,将很难以更具体的方式回答您的问题。显示一些您实际上遇到问题的代码。

于 2012-10-11T06:10:41.803 回答
0

停止线程是不好的。线程应该自己停止(结束它们的执行)。例如,您的主线程可以通过设置属性来指示线程停止。

于 2012-10-11T06:08:51.363 回答
0

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

于 2012-10-11T06:09:06.673 回答