【问题标题】:How to end non-daemon thread when the application exits?应用程序退出时如何结束非守护线程?
【发布时间】:2014-08-14 12:10:29
【问题描述】:

我的应用程序中有一个主线程,在这个主线程中我创建了另一个线程,假设它被命名为“WorkerThread”。 WorkerThread 有一个无限循环,它执行一些数据库搜索并最终通过串行端口与热敏打印机通信。 但是当用户关闭应用程序时,它仍然活着,因为线程仍在运行。 我知道我可以将我的线程设置为守护进程,这意味着当应用程序关闭时线程将停止,但我也知道这可能会导致 IO 错误。 那么,在非守护线程中实现此行为的最有效方法是什么?

【问题讨论】:

  • 你能用Tasks 代替吗?然后你可以告诉执行者停止所有的任务。

标签: java multithreading javafx javafx-2 javafx-8


【解决方案1】:

添加boolean 标志以在应用程序退出时停止线程。

public class WorkerThread extends Thread {

    private boolean running = false;

    @Override
    public void run() {
        while (running) {
            // do smth
        }
    }

    @Override
    public void start() {
        setRunning(true);
        super.start();
    }

    @Override
    public void setRunning(boolean value) {
        this.running = running;
    }
}

要停止线程,请调用workerThread.setRunning(false)

【讨论】:

  • 这是我认为最好的解决方案,但我什么时候调用 setRunning(false)?我无法控制应用程序的关闭,是用户通过关闭主窗口来关闭它。
  • WindowListener 添加到您的主窗口并收听windowClosing AND windowClosed 方法
  • 或使用shutdown hook thread stackoverflow.com/questions/2921945/…
  • 您应该将标志标记为volatile,或使用AtomicBoolean
  • 好吧,如果你在 JFrame 上setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),你就不必担心其他线程是否是守护进程......
【解决方案2】:

使用某种标志(布尔值?)来指示您的工作线程在完成当前正在处理的内容后停止。

【讨论】:

  • 并确保将其标记为volatile 或使用AtomicBoolean
【解决方案3】:

您应该使用 Thread.interrupt() 从主线程中断它。在工作线程中,在每次循环迭代时,它应该检查 workerThread.interrupted() 的返回,如果为真则清理并返回。

检查文档,因为像 wait() 这样的阻塞方法会抛出一个 InterruptedException,您可能需要对其进行评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多