多線程系列第(四)篇---線程的優(yōu)先級以及yeild和join方法

線程的優(yōu)先級

1.線程的優(yōu)先級分為1到10,1對應(yīng)MIN_PRIORITY,10對應(yīng)MAX_PRIORITY
2.可以通過setPriority方法為線程設(shè)置優(yōu)先級,默認的優(yōu)先級為5
3.在線程啟動前設(shè)置線程的優(yōu)先級
4.優(yōu)先級高的線程不一定就先執(zhí)行完,只是在進入運行狀態(tài)的機會要高于優(yōu)先級低的線程而已
結(jié)論:我們不能指望通過設(shè)置線程的優(yōu)先級來影響線程的執(zhí)行順序,而要通過其他方法來制定線程的執(zhí)行順序

優(yōu)先級代碼示例

public class PriorityDemo {

class Thread1 extends Thread {

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

    public void run() {
        int random;
        for (int i = 0; i < 5; i++) {
            random=new Random().nextInt(100);
            System.out.println(getName()+"第"+i+"次獲得隨機數(shù)"+random);
        }
    }
}

class Thread2 extends Thread {

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

    public void run() {
        int random;
        for (int i = 0; i < 5; i++) {
            random=new Random().nextInt(100);
            System.out.println(getName()+"第"+i+"次獲得隨機數(shù)"+random);
        }
    }
}

public static void main(String[] args) {
    PriorityDemo demo=new PriorityDemo();
    Thread1 t1=demo.new Thread1("線程1");
    Thread1 t2=demo.new Thread1("線程2");
    
    t1.setPriority(Thread.MIN_PRIORITY);
    t2.setPriority(Thread.MAX_PRIORITY);
    
    t1.start();
    t2.start();
    }
}

運行結(jié)果
線程1第0次獲得隨機數(shù)18
線程2第0次獲得隨機數(shù)43
線程1第1次獲得隨機數(shù)6
線程2第1次獲得隨機數(shù)6
線程1第2次獲得隨機數(shù)15
線程2第2次獲得隨機數(shù)32
線程1第3次獲得隨機數(shù)16
線程1第4次獲得隨機數(shù)73
線程2第3次獲得隨機數(shù)81
線程2第4次獲得隨機數(shù)11

當然上面只是其中的一種運行結(jié)果,列出這個結(jié)果主要是想說明,優(yōu)先級高的不一定就先執(zhí)行完

yeild

一個調(diào)用yield方法的線程,是要告訴虛擬機它樂意讓其他線程占用自己的位置,yield將當前線程由運行狀態(tài)置為就緒狀態(tài),來達到讓步的目的,但是剛進入就緒狀態(tài)的線程也可能馬上進入運行狀態(tài)。

yield代碼示例

public class YeildDemo {

class Thread1 extends Thread {

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

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(getName() + "第" + i + "次執(zhí)行");
            Thread.yield();
        }
    }
}

class Thread2 extends Thread {

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

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(getName() + "第" + i + "次執(zhí)行");
            Thread.yield();
        }
    }
}

public static void main(String[] args) {
    YeildDemo demo = new YeildDemo();
    Thread1 t1 = demo.new Thread1("線程1");
    Thread1 t2 = demo.new Thread1("線程2");

    t1.start();
    t2.start();
  }
}

上述代碼在沒有調(diào)用yeild方法的輸出結(jié)果

線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程1第3次執(zhí)行
線程1第4次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行
線程2第3次執(zhí)行
線程2第4次執(zhí)行

上述代碼在調(diào)用yeild方法的輸出結(jié)果

線程2第0次執(zhí)行
線程1第0次執(zhí)行
線程2第1次執(zhí)行
線程1第1次執(zhí)行
線程2第2次執(zhí)行
線程1第2次執(zhí)行
線程2第3次執(zhí)行
線程1第3次執(zhí)行
線程2第4次執(zhí)行
線程1第4次執(zhí)行

當然上述結(jié)果只是其中的一種運行結(jié)果,但經(jīng)過多次運行,大致就是上面的規(guī)律。

join

阻塞當前線程,直到調(diào)用join方法的線程執(zhí)行結(jié)束之后,才恢復(fù)執(zhí)行

join代碼示例

public class JoinDemo {

class Thread1 extends Thread {

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

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "第" + i + "次執(zhí)行");
        }
    }
}

class Thread2 extends Thread {

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

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "第" + i + "次執(zhí)行");
        }
    }
}

public static void main(String[] args) {
    System.out.println(Thread.currentThread().getName()+"執(zhí)行開始");

    
    JoinDemo demo = new JoinDemo();
    Thread1 t1 = demo.new Thread1("線程1");
    Thread1 t2 = demo.new Thread1("線程2");


    t1.start();
    t2.start();
    
    try {
        t1.join();
        t2.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(Thread.currentThread().getName()+"執(zhí)行結(jié)束");
  }

}

上述程序在沒有調(diào)用t1和t2的join方法的運行結(jié)果如下

main執(zhí)行開始
main執(zhí)行結(jié)束
線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行

上述程序在在調(diào)用了t1和t2的join方法的運行結(jié)果如下

main執(zhí)行開始
線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行
main執(zhí)行結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容