【问题标题】:Do I have to manually stop threads in Java?我必须手动停止 Java 中的线程吗?
【发布时间】:2010-08-21 06:41:52
【问题描述】:

当我的应用程序准备好退出时,可以通过关闭窗口或调用 System.exit() 方法。我是否必须手动停止我可能已经创建的线程,或者 Java 会为我处理这些问题?

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    如果您使用 System.exit()。所有线程都将停止,无论它们是否是守护进程。

    否则,JVM 会自动停止所有由 Thread.setDaemon(true) 设置的守护线程。换句话说,jvm只有在剩下的线程都是守护线程或者根本没有线程时才会退出。

    考虑下面的例子,即使在 main 方法返回后它也会继续运行。 但是如果你把它设置为daemon,它会在main方法(主线程)终止时终止。

    public class Test {
    
        public static void main(String[] arg) throws Throwable {
           Thread t = new Thread() {
              public void run()   {
                 while(true)   {
                    try  {
                       Thread.sleep(300);
                       System.out.println("Woken up after 300ms");
                    }catch(Exception e) {}
                 }
              }
           };
    
           // t.setDaemon(true); // will make this thread daemon
           t.start();
           System.exit(0); // this will stop all threads whether are not they are daemon
           System.out.println("main method returning...");
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您想在优雅退出之前停止线程,Shutdown Hooks 可能是一个选择。

      看起来像:

      Runtime.getRuntime().addShutdownHook(new Thread() {
          public void run() { 
          //Stop threads }
      });
      

      见:hook-design

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        相关资源
        最近更新 更多