java - 为什么我们使用标志来停止线程?

标签 java multithreading

当我试图弄清楚如何停止具有多个线程的程序中的线程时,
我是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然后返回)?我的意思是:这是浪费时间,不是吗?

最佳答案

当执行范围超出run()方法时,线程就会停止,因此当while循环被破坏时,线程就会停止。

如果情况需要,这还允许您进行一些清理:

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
}

上述方法允许您对线程如何停止以及之后发生的情况进行一些控制,而不是直接杀死它,这可能会导致各种问题。

关于java - 为什么我们使用标志来停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392643/

相关文章:

java - SQLite 用户名与 EditText 值进行检查

java - 使用独立 Java 从 Oracle 队列批量出列

java - 链表复制构造函数

java - 为什么在实现 Runnable 时使用 Thread.currentThread().isInterrupted() 而不是 Thread.interrupted()?

C# 应用程序创建许多连接线程,MySQL

java - 流API : create empty map with keys from enum

java - 如何使用服务帐户通过 Google Cloud SQL Java 进行身份验证

c# - 多线程-产生多个线程并等待

ruby-on-rails - 如何在开发中运行 Rails 多线程?

C# 线程和阻塞