是什麼
LockSupport 是JDK內部提供阻塞和喚醒線程的工具類。
-
void park()方法
如果線程未獲得許可證的前提下,調用了park方法將進行阻塞,否則不會阻塞直接返回。
-
void unpark(Thread thread) 方法
當某線程調用unpark(Thread thread) 方法時,傳入方法中對應的線程將會獲得許可證。
-
void parkNanos(long nanos) 方法
與 park()方法類似,只不過該方法會等到nanos 秒之後,如發現還未獲得許可證,那麼將不會繼續進行阻塞而是直接返回。
-
void park(Object blocker) 方法
與park()方法類似,只不過該方法將blocker對象信息存放到調用該park(Object blocker) 方法的線程的成員變量中去。
怎麼用
需求:我們現在希望A線程等待B線程處理1+2+3+…+100 求和運算成功之後,繼續處理它的邏輯,且看下面代碼
public class LockSupportDemo {
public static void main(String[] args) throws NoSuchFieldException, InterruptedException {
Thread a = new Thread(() -> {
System.out.println("等待B線程完成它的求和邏輯...");
//2.
LockSupport.park();
System.out.println("B線程已處理完畢...A線程繼續處理邏輯");
});
Thread b = new Thread(() -> {
sumCalc();
//3.
LockSupport.unpark(a);
});
a.start();
//1.
Thread.sleep(1000);
b.start();
}
private static void sumCalc() {
System.out.println("B線程進行求和運算中,結果爲:" + IntStream.range(1, 100).reduce(0, Integer::sum));
}
}
運行結果:
等待B線程完成它的求和邏輯...
B線程進行求和運算中,結果爲:4950
B線程已處理完畢...A線程繼續處理邏輯
代碼(1)處,我們對主線程進行sleep 1秒 是爲了保證A線程能先執行。代碼(2)處,A線程未取得許可證將進行阻塞。代碼(3)處,B線程調用unpark(Thread thread)並將A線程傳入,A線程立即獲得許可證不再進行阻塞。
書寫技術文章是一個循序漸進的過程,所以我不能保證每句話、每行代碼都是對的,但至少能保證不復制、不粘貼,每篇文章都是自己對技術的認識、細心斟酌總結出來的。喬布斯說:我們在這個星球上的時間都很短,很少有機會去做幾件真正偉大的事情,同時要做得好,我必須要趁我還年輕的時候完成這些事。
其實我想說的是,我是一枚程序員,我只想在有限的時間內儘可能去沉澱我這一生中所能沉澱下來的東西。