countdownlatch是juc中的乙個併發工具類,主要作用是阻塞某執行緒至其他執行緒完成後,再呼叫本執行緒。類似於thread.join()
countdownlatch countdownlatch=new countdownlatch(3);//在構造時傳入需要等待的執行緒數
new thread(()->,"t1").start();
new thread(()->,"t2").start();
new thread(()->,"t3").start();
try catch (interruptedexception e)
system.out.println("所有執行緒執行完畢")
###########
執行結果是:
t1-執行中
t1-執行完畢
t2-執行中
t2-執行完畢
t3-執行中
t3-執行完畢
所有執行緒執行完畢
勢必主線程呼叫會等待其餘執行緒執行完畢。
下來對countdownlatch中主要兩方法進行閱讀分析。
public void await() throws interruptedexception
public final void acquiresharedinterruptibly(int arg)
throws interruptedexception
protected int tryacquireshared(int acquires)
private void doacquiresharedinterruptibly(int arg)
throws interruptedexception
}//阻塞執行緒
if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
throw new interruptedexception();
}} finally
}private node addwaiter(node mode)
}enq(node);
return node;
}private void setheadandpropagate(node node, int propagate)
}
總結:
有執行緒呼叫await方法,由於state還不是0,會加入到aqs中進行阻塞,直到其他執行緒呼叫.countdown()將state遞減至0,該執行緒才會進行喚醒進行鎖爭搶。
public void countdown()
public final boolean releaseshared(int arg)
return false;
}//更新state,當state==0時,呼叫doreleaseshared();
protected boolean tryreleaseshared(int releases)
}private void doreleaseshared()
else if (ws == 0 &&
!compareandsetwaitstatus(h, 0, node.propagate)) //更改status為propagate
continue; // 迴圈cas
}if (h == head) // 如果頭節點被更改則跳出
break;
}}
總結:實現邏輯簡單來說就是每次呼叫對 state進行-1 直到為0時候進行喚醒執行緒,進行await()阻塞之後的**邏輯。 AQS之countDownLatch原始碼解析
public class countdownlatch int getcount protected int tryacquireshared int acquires protected boolean tryreleaseshared int releases private final syn...
多執行緒 CountDownLatch
countdownlatch 允許乙個或多個執行緒等待其他執行緒完成操作。應用場景 假如有這樣乙個需求,當我們需要解析乙個excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析乙個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中,要實現主線程...
執行緒同步 CountDownLatch
應用場景 有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await 方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown 方法,這個呼叫await ...