我是Java /线程的新手,并且继承了类似以下代码的内容。这是一个命令行程序,main()仅启动5-6种不同类型的线程,并以^ C退出。我想添加一个关闭钩子以正确关闭所有线程,并通过以下方式对其进行调整。
我在所有线程中添加了一个Shutdown钩子和一个stopThread()方法(例如MyWorker类中的一个)
问题是当我按^ CI时,看不到线程的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()或通过信号终止时,它将停止所有现有线程并启动所有关闭挂钩。也就是说,您的所有线程都可能在您启动钩子之前就死掉了。
您应该确保干净地关闭资源,而不是试图干净地停止线程。