------------------------------第一種實現 LockSupport的park和unpark方法(**重要1**)---------------------------------------------------------------
package com.example.demo.wxyDemo;
import java.util.concurrent.locks.LockSupport;
/**
* 用兩個線程,一個輸出字母,一個輸出數字,交替輸出1A2B3C4D...26Z
*/
public class ThreadOrderSwitch {
static Thread t1=null, t2=null;
public static void main(String[] args) {
char[] aI = "123456789".toCharArray();
char[] aC = "ABCDEFGHI".toCharArray();
t1 = new Thread(()->{
for(char c:aI){
System.out.print(c);
LockSupport.unpark(t2);
LockSupport.park();
}
});
t2 = new Thread(()->{
for(char c:aC){
LockSupport.park();
System.out.print(c);
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
}
打印結果:1A2B3C4D5E6F7G8H9ILockSupport
是一個線程阻塞工具類,所有的方法都是靜態方法,可以讓線程在任意位置阻塞,當然阻塞之后肯定得有喚醒的方法。
為什么叫park呢,park英文意思為停車。我們如果把Thread看成一輛車的話,park就是讓車停下,unpark就是讓車啟動然后跑起來。
類似的還可以用類似自旋鎖原理的volatile 和 AtomicInteger
自旋鎖示例:原地打轉,占用cpu,不放棄cpu,(執行時間短快)不經過操作系統即內核態
相對重量級鎖:
atomicInteger
===========================使用阻塞隊列操作ArrayBlockingQueue======take()和put()方法阻塞======================
================================**重點2**使用sychnorized,wait,notify方法實現(重要)=====================================
運行結果:1A2B3C... 或者A1B2C3... (任一結果不確定)
循環完了執行notify是為了停止線程,兩個交替運行的話,總有一個是wait狀態,導致線程無法停止,需要喚醒讓線程執行完畢。
想要輸出想要的1A2B3C...,可以使用:
(1)countDownLatch,讓想要線運行的線程執行輸出后latch.countDown(),后運行的線程執行latch.await()
(2)======================**重點3**===============================
使用可重用鎖ReenTranLook的創建兩個條件condition,(ReenTranLook.newCondition()),可精確的在哪種條件下通知哪些線程運行(重點)