java - 我必须手动停止 Java 中的线程吗?

标签 java multithreading concurrency

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

最佳答案

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

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

考虑下面的示例,即使在 main 方法返回后它仍将继续运行。 但是如果你将它设置为守护进程,它会在 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...");
    }
}

关于java - 我必须手动停止 Java 中的线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3536640/

相关文章:

java - Hibernate 4.3.10 中的 EJB3PersistEventListener 在哪里?

Java 执行器服务 : should I put a lock before to use execute?

c++ - 线程化此方法会产生段错误,为什么?

c# - 线程安全问题

python - Postgres 是否缓存我们的查询以及我们如何绕过它?

java - 为什么将 "L"添加到我的 Java 路径中?

java - 如何集成 Facebook api

java - 如何在使用 ResourceBundle API 获取的属性文件中转义大括号

go - 有什么办法可以推到golang的 channel 前面吗?

java - Java中并发管道的策略