java多線程系列基礎篇10-----線程優先級和守護線程

1 線程優先級的介紹

java中的線程優先級的範圍是1-10,默認的優先級是5。"高優先級線程"會優先於"低優先級線程"執行

java中有兩種線程:用戶線程和守護線程。可以通過isDaemon()方法來區別他們:如果返回false,則說明該線程是"用戶線程";否則就是"守護線程"

用戶線程一般用戶執行用戶級任務,而守護線程也就是後臺線程,一般用來執行後臺任務,需要注意的是:java虛擬機在"用戶線程"都結束後會退出

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

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

當java虛擬機啓動時,通常有一個單一的非守護線程(該線程通過是通過main()方法啓動).。JVM會一直運行直到下面的任意一個條件發生,JVM就會終止運行。

01)調用了exit()方法,並且exit()有權被正常執行

02)所有的"非守護線程"都死了(即jvm中僅僅只有"守護線程")

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

線程優先級的示例

package com.tuhu.filt.javadatasleep;

public class Demo {
    public static void main(String[] args) {
        System.out.println(
                Thread.currentThread().getName()
                +"("
                +Thread.currentThread().getPriority()
                +")"
        );

        Thread t1 = new MyThread2("t1");
        Thread t2 = new MyThread2("t2");
        t1.setPriority(1); //設置t1的優先級爲1
        t2.setPriority(10);//設置t2的優先級爲10
        t1.start();
        t2.start();
    }
}
class MyThread2 extends  Thread{
    public MyThread2(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
            );
        }
    }
}
main(5)
t2 (10), loop 0
t2 (10), loop 1
t2 (10), loop 2
t2 (10), loop 3
t2 (10), loop 4
t1 (1), loop 0
t1 (1), loop 1
t1 (1), loop 2
t1 (1), loop 3
t1 (1), loop 4

01 它主線程main的優先級是5

02 t1的優先級設爲1  t2的優先級設爲10 cpu在執行t1和t2的時候,根據時間片輪詢調度,所以能夠併發執行

3 守護線程的示例

package com.tuhu.filt.javadataDemo;

public class Demo {
    public static void main(String[] args) {
        System.out.println(
                Thread.currentThread().getName()
                        +"(isDaemon="+Thread.currentThread().isDaemon()+ ")"
        );
        Thread t1 = new MyThread("t1");
        Thread t2 = new MyThread("t2");
        //將t2設置爲守護線程
        t2.setDaemon(true);
        t1.start();
        t2.start();
    }
}
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){
        }
    }
}
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){

        }
    }
}
main(isDaemon=false)
t1(isDaemon=false), loop 0
t2(isDaemon=true), loop 0
t1(isDaemon=false), loop 1
t2(isDaemon=true), loop 1
t2(isDaemon=true), loop 2
t1(isDaemon=false), loop 2
t2(isDaemon=true), loop 3
t1(isDaemon=false), loop 3
t2(isDaemon=true), loop 4
t1(isDaemon=false), loop 4

01 主線程main是用戶線程,它創建的子線程t1也是用戶線程

02 t2是守護線程,在"主線程main" 和 "子線程t1"(他們都是用戶線程)執行完畢,只剩t2這個守護線程的時候JVM自動退出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章