JUC學習-4_JUC輔助類_CountDownLatch-CyclicBarrier-Semaphore
阿新 • • 發佈:2021-06-28
減法計數器 CountDownLatch
// 減法 計數器 // 每次有執行緒呼叫 countDown() 數量-1 假設計數器變為0 countDownLatch.await()就會被喚醒 繼續執行 public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { // 總數是6 必須要執行任務的時候 再使用 CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 1; i <= 6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+" Go out"); countDownLatch.countDown();//-1 }, String.valueOf(i)).start(); } countDownLatch.await(); // 等待計數器歸零 然後再向下執行 System.out.println("關門"); } }
加法計數器 CyclicBarrier
public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> { System.out.println("召喚神龍"); }); for (int i = 1; i <= 7; i++) { int temp = i; new Thread(() -> { System.out.println(Thread.currentThread().getName() + "==" + temp + "=="); try { cyclicBarrier.await(); //等待 } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }, String.valueOf(i)).start(); } } }
Semaphore: 訊號位
public class SemaphoreDemo { public static void main(String[] args) { // 執行緒數量 Semaphore semaphore = new Semaphore(3); for (int i = 1; i <= 6; i++) { new Thread(() -> { try { semaphore.acquire(); // 得到 System.out.println(Thread.currentThread().getName() + "搶到車位"); TimeUnit.SECONDS.sleep(2); System.out.println(Thread.currentThread().getName() + "離開車位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release();//釋放 } }, String.valueOf(i)).start(); } } }