Java多線程(十)——線程優先級和守護線程

1、線程優先級的介紹java

     java 中的線程優先級的範圍是1~10,默認的優先級是5。「高優先級線程」會優先於「低優先級線程」執行。併發

     java 中有兩種線程:用戶線程守護線程。能夠經過isDaemon()方法來區別它們:若是返回false,則說明該線程是「用戶線程」;不然就是「守護線程」。用戶線程通常用於執行用戶級任務,而守護線程也就是「後臺線程」,通常用來執行後臺任務。須要注意的是:Java虛擬機在「用戶線程」都結束後會後退出。oop

JDK 中關於線程優先級和守護線程的介紹以下:this

      每一個線程都有一個優先級。「高優先級線程」會優先於「低優先級線程」執行。每一個線程均可以被標記爲一個守護進程或非守護進程。在一些運行的主線程中建立新的子線程時,子線程的優先級被設置爲等於「建立它的主線程的優先級」,當且僅當「建立它的主線程是守護線程」時「子線程纔會是守護線程」。spa

    當Java虛擬機啓動時,一般有一個單一的非守護線程(該線程經過是經過main()方法啓動)。JVM會一直運行直到下面的任意一個條件發生,JVM就會終止運行:
    (01) 調用了exit()方法,而且exit()有權限被正常執行。
    (02) 全部的「非守護線程」都死了(即JVM中僅僅只有「守護線程」)。線程

    每個線程都被標記爲「守護線程」或「用戶線程」。當只有守護線程運行時,JVM會自動退出。code

2、線程優先級的示例blog

咱們先看看優先級的示例 :進程

package com.demo.threadPriority;

public class MyThread extends Thread{
    
    public MyThread(String name) {
        super(name);
    }

    public void run(){
        for (int i=0; i<5; i++) {
            System.out.println(Thread.currentThread().getName()
                    +"("+Thread.currentThread().getPriority()+ ")"
                    +", loop "+i);
        }
    } 

}
package com.demo.threadPriority;

public class Demo {
    
    public static void main(String[] args) {  

        System.out.println(Thread.currentThread().getName()
                +"("+Thread.currentThread().getPriority()+ ")");

        Thread t1=new MyThread("t1");    // 新建t1
        Thread t2=new MyThread("t2");    // 新建t2
        t1.setPriority(1);               // 設置t1的優先級爲1
        t2.setPriority(10);              // 設置t2的優先級爲10
        t1.start();                      // 啓動t1
        t2.start();                      // 啓動t2
    }  

}

運行結果:get

main(5)
t1(1), loop 0
t1(1), loop 1
t2(10), loop 0
t1(1), loop 2
t2(10), loop 1
t1(1), loop 3
t2(10), loop 2
t1(1), loop 4
t2(10), loop 3
t2(10), loop 4

結果說明
(01) 主線程main的優先級是5。
(02) t1的優先級被設爲1,而t2的優先級被設爲10。cpu在執行t1和t2的時候,根據時間片輪循調度,因此可以併發執行。

3、守護線程的示例

下面是守護線程的示例。

package com.demo.daemonThread;

public class MyThread extends Thread{
    
    public MyThread(String name) {
        super(name);
    }

    public void run(){
        try {
            for (int i=0; i<5; i++) {
                Thread.sleep(3);
                System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
            }
        } catch (InterruptedException e) {
        }
    } 

}
package com.demo.daemonThread;

public class MyDaemon extends Thread{

    public MyDaemon(String name) {
        super(name);
    }

    public void run(){
        try {
            for (int i=0; i<10000; i++) {
                Thread.sleep(1);
                System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
            }
        } catch (InterruptedException e) {
        }
    } 
}
package com.demo.daemonThread;

public class Demo {

    public static void main(String[] args) {  

        System.out.println(Thread.currentThread().getName()
                +"(isDaemon="+Thread.currentThread().isDaemon()+ ")");

        Thread t1=new MyThread("t1");    // 新建t1
        Thread t2=new MyDaemon("t2");    // 新建t2
        t2.setDaemon(true);              // 設置t2爲守護線程
        t1.start();                      // 啓動t1
        t2.start();                      // 啓動t2
    }  

}

運行結果:

main(isDaemon=false)
t2(isDaemon=true), loop 0
t2(isDaemon=true), loop 1
t1(isDaemon=false), loop 0
t2(isDaemon=true), loop 2
t1(isDaemon=false), loop 1
t2(isDaemon=true), loop 3
t2(isDaemon=true), loop 4
t1(isDaemon=false), loop 2
t2(isDaemon=true), loop 5
t2(isDaemon=true), loop 6
t1(isDaemon=false), loop 3
t2(isDaemon=true), loop 7
t2(isDaemon=true), loop 8
t2(isDaemon=true), loop 9
t1(isDaemon=false), loop 4

結果說明
(01) 主線程main是用戶線程,它建立的子線程t1也是用戶線程。
(02) t2是守護線程。在「主線程main」和「子線程t1」(它們都是用戶線程)執行完畢,只剩t2這個守護線程的時候,JVM自動退出。

相關文章
相關標籤/搜索