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

时间:2015-10-09 07:00:33

标签: java

我有一个无休止地运行的多线程控制台应用程序。现在我使用ctrl-c来结束它,但有时它会导致finally块不被调用,并留下一些进程,即使在主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()。我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果要执行清理,可以注册关闭钩子:

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

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

答案 1 :(得分:0)

如果要清理,可能需要考虑关闭挂钩。 请参阅:Java shutdown hook