java-关闭线程与精灵(后台)线程

一、

1、在正常的关闭中,JVM首先启动所有已经注册的Shutdownhook。关闭钩子是使Runtime.addShutdownHook注册的尚未开始的线程。JVM并不能保证关闭钩子的开始顺序。如果关闭应用程序线程时,它仍然在运行,它们将与关闭进程并发执行。

2、当所有关闭钩子结束的时候,如果runFinalizersOnExit为true,JVM可以选择运行finalizer,之后停止。

3、JVM不会尝试停止或中断任何关闭时仍然在运行中的应用程序线程;它们在JVM最终终止时被强制退出。

4、关闭钩子全是并发执行,不应依赖于可能被应用程序或其他关闭钩子关闭的服务,而不是每个服务使用一个。

5、

public void start(){

   Runtime.getRuntime().addShutdownHook(new Thread(){

           public void run(){

                  try {LogServie.this.stop();}

                   catch (InterruptedException ignored) {}

           }

    });

}

二、精灵线程(后台线程daemon thread)

1、JVM启动时创建的所有线程,除了主线程以外,其他的都是精灵线程。当一个线程创建时,新线程继承了创建它的线程的后台状态,所以默认情况下,任何主线程创建的线程都是普通线程。

2、精灵线程与普通线程的区别仅在退出时会发生什么。当一个线程退出时,JVM会检查一个运行中线程的详细清单,如果仅剩下精灵线程,它会发起正常的退出。当JVM停止时,所有仍然存在的精灵线程会被抛弃,不会执行finally块,也不会释放栈-JVM直接退出。

3、垃圾回收器对那些具有特殊finally方法的对象会进行特殊对待:在回收器获得它们后,finallize被调用时,这样就能保证持久化的资源可以被释放。任何finalizer访问的状态必须被同步

你可能感兴趣的:(java,jvm,thread,应用服务器)