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的博客