1、LockSupport工具類
1.該類的主要做用
-
掛起和喚醒線程,該工具類是建立鎖和其餘同步類的基礎。
-
LockSupport類與每一個使用它的線程都會關聯一個許可證,默認狀況下調用LockSupport類的方法的線程是不持有許可證的。LockSupport使用Unsafe類進行實現的。
2.void park()方法
-
若是調用park方法的線程已經拿到了與LockSupport關聯的許可證,則調用LockSupport.park()時會立刻返回,不然調用線程會禁止參與線程的調度,也就是會被阻塞掛起
-
下面的代碼只會輸出"begin park!,而後當前線程被掛起,這是由於在默認狀況下調用線程是不持有許可證的
package com.ruigege.LockSourceAnalysis6;
import java.util.concurrent.locks.LockSupport;
public class Test1 {
public static void main(String[] args) {
System.out.println("begin park!");
LockSupport.park();
System.out.println("end park");
}
}
-
其餘線程調用unpark(Thread thread)方法而且將當前線程做爲參數時,調用park方法而被阻塞的線程就會被返回。另外,若是其餘線程調用了阻塞線程的interrupt()方法時,設置了中斷標誌或者線程被虛假喚醒,則阻塞線程也會返回,因此在調用park方法時最好也是用循環條件的判斷方式。須要注意的是,由於調用park方法而被阻塞的線程被其餘線程中斷而返回時並不會拋出InteruptedException異常
3.void unpark(Thread thread)方法
package com.ruigege.LockSourceAnalysis6;
import java.util.concurrent.locks.LockSupport;
public class Test2 {
public static void main(String[] args) {
System.out.println("李天陽");
LockSupport.unpark(Thread.currentThread());
LockSupport.park();
System.out.println("end park");
}
}
-
當一個線程調用unpark時,若是參數thread線程沒有持有thread與LockSupport類關聯的許可證,則讓thread線程持有,若是thread以前由於調用park()而被掛起,則調用upark以後,該線程會被喚醒。若是thread以前沒有調用park,則調用unpark方法後,再調用park方法,其會馬上返回。
2、源碼:
-
所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5
-
https://github.com/ruigege66/ConcurrentJava
-
-
-
歡迎關注微信公衆號:傅里葉變換,我的帳號,僅用於技術交流