java - 优雅地结束基于控制台的多线程程序

标签 java

我有一个无限运行的多线程控制台应用程序。现在我使用ctrl-c来结束它,但有时它会导致finally block 不被调用,并留下一些原始程序开始运行的进程,即使在主java程序结束后。

我在 Stackoverflow 上找到了这个答案

https://stackoverflow.com/a/3194586/492015

class MyThread extends Thread
{
  volatile boolean finished = false;

  public void stopMe()
  {
    finished = true;
  }

  public void run()
  {
    while (!finished)
    {
      //do dirty work
    }
  }
}

但是由于我的程序是基于控制台的,这将如何应用?我需要让程序等待键盘输入吗?因此,如果我按“q”,例如 stopMe() 就会被调用。我该怎么做?

最佳答案

如果你想执行清理,你可以注册一个关闭钩子(Hook):

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        // do the cleanup
    }
});

根据我的经验,它总是在按下 Ctrl+C 时执行。

关于java - 优雅地结束基于控制台的多线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33031878/

相关文章:

java - HashMap 何时以及如何将桶从链表转换为红黑树?

java - 如何通过循环 Id 数组来设置按钮 Id,并使用循环设置按钮文本?

java - 通过在 Eclipse 中突出显示方法名称,将测试方法添加到现有测试用例

java - 如果扫描程序未关闭,java 进程是否会保持文件打开?

java - 表单向 Servlet 发送空查询字符串

java - getter 和 setter 的替代方案

java - 调试日志记录不适用于特定处理程序

java - 尽管仔细检查了我的逻辑,但我的 if 条件返回 true

java - 什么会导致 Hibernate 4 出现 "Too many connection"

java - Android ImageButton不显示图像