一個好用的東西.阻塞和釋放線程用的.
先看代碼:
public static void aaa() {
System.out.println("阻塞開始");
LockSupport.park();
System.out.println("111");
}
park()就是執行線程一直阻塞,111根本不會執行.
再看這個代碼:
public static void aaa() {
System.out.println("阻塞開始");
LockSupport.unpark(Thread.currentThread());
LockSupport.park();
System.out.println("111");
}
這個111是會執行的.
原理:
LockSupport和關聯的每一個線程都有一個許可permit.這個許可permit只有0 和1 兩個值.默認是0.
unpark ---> permit =1;
park ----> if (permit == 0){
阻塞
}
if (permit ==1){
permit = 0;
}
也就是說,
1.無論如何unpark會將permit設置爲1.
2.如果permit = 0,線程阻塞.
3.如果permit =1 ,park會將permit = 0
看看下面這個發令槍的小案例吧.和countDownLatch有些類似.
public static void aaa() throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ready!!!");
LockSupport.park();//阻塞
System.out.println("go!!!!");
}
});
t.start();// 啓動時阻塞
// 3秒後執行發放通行證
Thread.sleep(3000);
LockSupport.unpark(t);
}
處於park狀態的線程怎麼離開park狀態?javadoc如是說:
1.被unpark
2.被interrupts
3.虛假返回??