如果我的员工没有重复完成,我怎么能停止一个帖子呢?

时间:2012-10-11 06:01:13

标签: java concurrency

我已经了解了许多关于停止线程的现有答案。我复制下面的典型代码。

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方法中做的是一个顺序和单一路径的东西所以我没有机会检查两次中断状态。例如,我想要停止正在搜索所有磁盘的线程,这需要花费很多时间。

我该如何阻止它?

3 个答案:

答案 0 :(得分:3)

在长时间运行的过程中,你必须有一些点,你可以说if (!keepRunning) { break; } else { do next directory/file(); }离开循环。

在你的稻草人示例中,如果您正在搜索磁盘,那么在处理每个文件和目录以包含此检查逻辑之前,您会有一些积分。

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

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

答案 1 :(得分:0)

停止线程很糟糕。线程应该自己停止(结束执行)。例如,您的主线程可以通过设置属性来通知线程停止。

答案 2 :(得分:0)

“搜索所有磁盘内容”的主题应该以一种可以及时中断它的方式实现。