Java多線程 -- 03 控制線程

目錄導讀
  • join線程:join
  • 后臺線程(Daemon Thread)
  • 線程睡眠:sleep
  • 線程讓步:yield
  • 改變線程優(yōu)先級

Java的線程支持了一些工具方法,可以控制線程的執(zhí)行

1.join線程

Thread類提供了一個線程等待另一個線程完成的方法:join()

join()方法通常由使用線程的程序調(diào)用。

join()方法的三種重載方式:

join(); //等待被join的線程執(zhí)行完畢
join(long millis); //等待被join線程的時間最長為millis毫秒,
join(long millis, int nanos); //最多等待millis毫米+nanos納秒長的時間

public class JoinThread extneds Thread {
    run() {
    ....
    }
    public static void main(String[] args) {
        for(int i = 0; i < 100; i++) {
            if(i == 20) {
                JoinThread jt = new JoinThread("join線程");
                jt.start();
                jt.join();//在main線程中執(zhí)行了jt線程的join()方法,因此main線程將會等待jt線程執(zhí)行完畢才往下繼續(xù)執(zhí)行。
            }
        }
        
    }
}
2.后臺線程(Daemon Thread)

有一種線程是在后臺運行(前面的方式建立的線程都是前臺線程),它的任務是為其他線程提供服務,這種線程被稱為“后臺線程(Daemon Thread)”, 有稱為"守護線程"、"精靈線程"。JVM的垃圾回收線程就是典型的后臺線程

后臺線程的特征:所有的前臺線程都死亡了,后臺線程會自動死亡

設置一個線程為后臺線程:
調(diào)用Thread對象的setDaemon(true)即可

判斷一個線程是否為后臺線程:
調(diào)用Thread對象的isDaemon()方法

注意:
1.主線程默認是前臺線程,并不是所有的線程都被默認為前臺線程。
2.在前臺線程中創(chuàng)建的子線程默認為前臺線程,在后臺線程中創(chuàng)建的子線程默認為后臺線程
3.setDaemon()方法的調(diào)用時在start()之前調(diào)用,否則引發(fā)IllegalThreadStateException異常

3.線程睡眠:sleep

通過調(diào)用Thread類的靜態(tài)sleep()方法來實現(xiàn)

sleep()方法的重載形式:
static void sleep(long millis); //讓正在執(zhí)行的線程暫停millis毫秒,并進入阻塞狀態(tài),
static void sleep(long millis, int nanos); //暫停 millis毫秒+nanos納秒 的時間

public class SleepThread {
    public static void main(String[] args) {
        ...
        Thread.sleep(); //讓主線程進入睡眠
    }
}

注意:當線程調(diào)用sleep()方法進入阻塞狀態(tài)后,在其睡眠期間,即使系統(tǒng)中沒有其他的可執(zhí)行線程,該線程也不會獲得執(zhí)行的機會。

4.線程讓步:yield

Thread類中提供了一個yield()的靜態(tài)方法,它也讓正在執(zhí)行的線程暫停,但不會讓它進入阻塞狀態(tài),而是進入了就緒狀態(tài)。

public class YieldThread extends Thread {
    
    public void run() {
        Thread,yield(); //讓當前線程讓步
    }
    
    public static void main(String[] args) {
        ...

        Thread.yield(); //主線程讓步
    }
}

注意:yield()方法只是讓當前線程暫停一下,讓系統(tǒng)的線程的調(diào)度器重新調(diào)度一次(相當于洗牌后讓大家重新?lián)屌疲莾?yōu)先越高的線程越容易搶到牌), 這是和sleep()方法區(qū)別。

sleep()方法和yield()方法的區(qū)別:
1.sleep方法暫停當前線程后,會給其他線程的執(zhí)行機會,不會理會其他線程的優(yōu)先級;yield只會各級優(yōu)先級相同會優(yōu)先級更改的線程執(zhí)行的機會
2.sleep會使當前線程進入阻塞狀態(tài),而yield會使當前線程強制進入就緒狀態(tài)
3.sleep方法聲明拋出InterruptedException異常,因此sleep方法要么捕捉該異常,要么顯式聲明拋出異常;yield方法則沒有拋出任何異常
4.sleep比yield有更好的可移植性,不建議使用yield方法來控制并發(fā)線程的執(zhí)行

5.改變線程優(yōu)先級

每個線程執(zhí)行時都具有一定的優(yōu)先級,優(yōu)先級越高的線程獲得較多的執(zhí)行機會,優(yōu)先級低的線程則獲得較少的執(zhí)行機會

Thread類提供setPriority(int newPriority), getPriority()方法來設置和返回線程的優(yōu)先級
其中:newPriority的取值是1~10之間的
Thread類也提供了三個靜態(tài)常量:

MAX_PRIORITY, 對應值為10
MIN_PRIORITY, 1
NORM_PRIORITY, 5

注意:
1.主線程main默認是普通線程,優(yōu)先級為5
2.在父線程中創(chuàng)建的子線程優(yōu)先級的級別同父線程
3.為了使得程序有更好的移植性,setPriority()方法不要使用數(shù)字,直接使用MAX_PRIORITY,MIN_PRIORITY, NORM_PRIORITY 靜態(tài)常量.
4.優(yōu)先級的設置是在線程啟動之后設置的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容