天天看點

02.線程阻塞狀态/線程控制

02.線程阻塞狀态/線程控制

​​四.Java多線程的阻塞狀态與線程控制​​

​上文已經提到Java阻塞的幾種具體類型。下面分别看下引起Java線程阻塞的主要方法。​

​​1.join()​​

​join —— 讓一個線程等待另一個線程完成才繼續執行。如A線程線程執行體中調用B線程的join()方法,則A線程被阻塞,知道B線程執行完為止,A才能得以繼續執行。​

02.線程阻塞狀态/線程控制

​​2.sleep()​​

​sleep —— 讓目前的正在執行的線程暫停指定的時間,并進入阻塞狀态。在其睡眠的時間段内,該線程由于不是處于就緒狀态,是以不會得到執行的機會。即使此時系統中沒有任何其他可執行的線程,出于sleep()中的線程也不會執行。是以sleep()方法常用來暫停線程執行。​

​前面有講到,當調用了建立的線程的start()方法後,線程進入到就緒狀态,可能會在接下來的某個時間擷取CPU時間片得以執行,如果希望這個新線程必然性的立即執行,直接調用原來線程的sleep(1)即可。​

02.線程阻塞狀态/線程控制

​注:睡一個毫秒級夠了,因為CPU不會空閑,會切換到建立的線程。​

​​3.背景線程(Daemon Thread)​​

​概念/目的:背景線程主要是為其他線程(相對可以稱之為前台線程)提供服務,或“守護線程”。如JVM中的垃圾回收線程。​

​生命周期:背景線程的生命周期與前台線程生命周期有一定關聯。主要展現在:當所有的前台線程都進入死亡狀态時,背景線程會自動死亡(其實這個也很好了解,因為背景線程存在的目的在于為前台線程服務的,既然所有的前台線程都死亡了,那它自己還留着有什麼用...偉大啊 ! !)。​

​設定背景線程:調用Thread對象的setDaemon(true)方法可以将指定的線程設定為背景線程。​

02.線程阻塞狀态/線程控制

​判斷線程是否是背景線程:調用thread對象的isDeamon()方法。​

​注:main線程預設是前台線程,前台線程建立中建立的子線程預設是前台線程,背景線程中建立的線程預設是背景線程。調用setDeamon(true)方法将前台線程設定為背景線程時,需要在start()方法調用之前。前天線程都死亡後,JVM通知背景線程死亡,但從接收指令到作出響應,需要一定的時間。​

​​4.改變線程的優先級/setPriority():​​

​每個線程在執行時都具有一定的優先級,優先級高的線程具有較多的執行機會。每個線程預設的優先級都與建立它的線程的優先級相同。main線程預設具有普通優先級。​

​設定線程優先級:setPriority(int priorityLevel)。參數priorityLevel範圍在1-10之間,常用的有如下三個靜态常量值:​

​MAX_PRIORITY:10​

​MIN_PRIORITY:1​

​NORM_PRIORITY:5​

​擷取線程優先級:getPriority()。​

​​注:具有較高線程優先級的線程對象僅表示此線程具有較多的執行機會,而非優先執行。​​

02.線程阻塞狀态/線程控制

​​5.線程讓步:yield()​​

​上一篇博文中已經講到了yield()的基本作用,同時,yield()方法還與線程優先級有關,當某個線程調用yiled()方法從運作狀态轉換到就緒狀态後,CPU從就緒狀态線程隊列中隻會選擇與該線程優先級相同或優先級更高的線程去執行。​

02.線程阻塞狀态/線程控制