Java Shutdown挂钩未运行
发布时间:2020-12-15 05:20:39 所属栏目:Java 来源:网络整理
导读:我是 Java / threads的新手,我继承了类似下面的代码.它是一个命令行程序,main()只启动5-6种不同类型的线程,并以^ C退出.我想添加一个关闭钩子来正确关闭所有线程并按以下方式调整它. 我在所有线程中添加了一个Shutdown钩子和一个stopThread()方法(比如MyWork
我是
Java / threads的新手,我继承了类似下面的代码.它是一个命令行程序,main()只启动5-6种不同类型的线程,并以^ C退出.我想添加一个关闭钩子来正确关闭所有线程并按以下方式调整它.
我在所有线程中添加了一个Shutdown钩子和一个stopThread()方法(比如MyWorker类中的那个) 问题是当我按下^ C时,我没有看到Thread的run方法中的结束消息.这是在后台完成还是我的方法有问题.另外,我应该遵循更好的模式吗? 谢谢 public class Main { public static MyWorker worker1 = new MyWorker(); // .. various other threads here public static void startThreads() { worker1.start(); // .. start other threads } public static void stopThreads() { worker1.stopThread(); // .. stop other threads } public static void main(String[] args) throws Exception { startThreads(); // TODO this needs more work (later) Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { stopThreads(); } catch (Exception exp) { } } }); } } public class MyWorker extends Thread { private volatile boolean stop = false; public void stopThread() { stop = true; } public void run() { while (!stop) { // Do stuff here } // Print exit message with logger } } 解决方法
当您调用System.exit()或通过信号终止时,它会停止所有现有线程并启动所有关闭挂钩.也就是你挂钩开始时你的所有线程都可能已经死了.
您应该确保资源完全关闭,而不是试图干净地停止线程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |