java中的daemon threadjava
java中有两种类型的thread,user threads 和 daemon threads。git
User threads是高优先级的thread,JVM将会等待全部的User Threads运行完毕以后才会结束运行。github
daemon threads是低优先级的thread,它的做用是为User Thread提供服务。 由于daemon threads的低优先级,而且仅为user thread提供服务,因此当全部的user thread都结束以后,JVM会自动退出,无论是否还有daemon threads在运行中。线程
由于这个特性,因此咱们一般在daemon threads中处理无限循环的操做,由于这样不会影响user threads的运行。code
daemon threads并不推荐使用在I/O操做中。教程
可是有些不当的操做也可能致使daemon threads阻塞JVM关闭,好比在daemon thread中调用join()方法。get
咱们看下怎么建立daemon thread:博客
public class DaemonThread extends Thread{ public void run(){ while(true){ log.info("Thread A run"); try { log.info("Thread A is daemon {}" ,Thread.currentThread().isDaemon()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { DaemonThread daemonThread = new DaemonThread(); daemonThread.setDaemon(true); daemonThread.start(); } }
建立 daemon thread很简单,只须要在建立以后,设置其daemon属性为true便可。it
注意setDaemon(true)必须在thread start()以前执行,不然会抛出IllegalThreadStateException
上面的例子将会马上退出。io
若是咱们将daemonThread.setDaemon(true);去掉,则由于user thread一直执行,JVM将会一直运行下去,不会退出。
这是在main中运行的状况,若是咱们在一个@Test中运行,会发生什么现象呢?
public class DaemonThread extends Thread{ public void run(){ while(true){ log.info("Thread A run"); try { log.info("Thread A is daemon {}" ,Thread.currentThread().isDaemon()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } @Test public void testDaemon() throws InterruptedException { DaemonThread daemonThread = new DaemonThread(); daemonThread.start(); } }
咱们将main方法改为了@Test执行。执行以后咱们会发现,无论是否是daemon thread, Test都会马上结束。
再看一个daemon线程中启动一个user thread的状况:
public class DaemonBThread extends Thread{ Thread worker = new Thread(()->{ while(true){ log.info("Thread B run"); log.info("Thread B is daemon {}",Thread.currentThread().isDaemon()); } }); public void run(){ log.info("Thread A run"); worker.start(); } public static void main(String[] args) { DaemonBThread daemonThread = new DaemonBThread(); daemonThread.setDaemon(true); daemonThread.start(); } }
这个例子中,daemonThread启动了一个user thread,运行以后咱们会发现,即便有user thread正在运行,JVM也会马上结束执行。
本文的例子能够参考https://github.com/ddean2009/learn-java-concurrency/tree/master/DaemonThread
更多教程请参考 flydean的博客