java中的daemon thread

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

相關文章
相關標籤/搜索