java開關暫存器例子
阿新 • • 發佈:2019-01-24
有時候我們有這樣的一個需求,併發多個任務,需要等待一個訊號,然後他們都開始執行,所有任務執行完成後通知主執行緒。如果是類似這樣的需求你就可以考慮CountDownLatch這個類了。話不多說,直接上程式碼:
執行main方法的結果為:import java.util.concurrent.CountDownLatch; /** * 開關鎖存器 * @author li * */ public class LatchTest { private static final int N=5; public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal=new CountDownLatch(1); CountDownLatch allTaskEndSignal=new CountDownLatch(N); for(int i=0;i<N;i++){ new Thread(new TaskLatch(startSignal,allTaskEndSignal)).start(); } System.out.println("main:"+System.nanoTime()); Thread.sleep(1000); startSignal.countDown(); System.out.println("main:"+System.nanoTime()); allTaskEndSignal.await(); System.out.println("main:"+System.nanoTime()); } static class TaskLatch implements Runnable{ /* * 用於等待啟動訊號 */ private final CountDownLatch startSignal; /* * 傳送結束訊號 */ private final CountDownLatch taskEndSignal; public TaskLatch(CountDownLatch startSignal,CountDownLatch taskEndSignal){ this.startSignal=startSignal; this.taskEndSignal=taskEndSignal; } @Override public void run() { try { startSignal.await();//阻塞 doSomething(); } catch (InterruptedException e) { //IG } taskEndSignal.countDown(); } private void doSomething() throws InterruptedException{ System.out.println(Thread.currentThread().getName()+":"+System.nanoTime()); Thread.sleep(1000); } } }
main:92926451620442
main:92927451389987
Thread-4:92927451744534
Thread-3:92927451637703
Thread-2:92927451625574
Thread-0:92927451480023
Thread-1:92927451480489
main:92928453290545