java多線程快速入門(二十一)
阿新 • • 發佈:2018-11-26
第一次 () trace for import else spl 自己的 arr
CountDownLatch(閉鎖)計數器
有一個任務A,它要等待其他4個任務執行完畢之後才執行,此時就可以利用CountDownLatch來實現這種功能
package com.cppdy; import java.util.concurrent.CountDownLatch; class MyThread17 extends Thread{ private CountDownLatch countdownlatch; public MyThread17(CountDownLatch countdownlatch) { this.countdownlatch=countdownlatch; } @OverrideView Codepublic void run() { try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(getName()+"線程執行完畢"); countdownlatch.countDown(); } } public class ThreadDemo17 { public static void main(String[] args) throwsException { CountDownLatch cd=new CountDownLatch(2); MyThread17 my1 = new MyThread17(cd); MyThread17 my2 = new MyThread17(cd); my1.start(); my2.start(); Thread.sleep(300); cd.await(); System.out.println("主線程結束"); } }
CyclicBarrier(回環柵欄)
CyclicBarrier初始化時規定一個數目,然後計算調用了CyclicBarrier.await()進入等待的線程數。當線程數達到這個數目時,所有進入等待狀態的線程被喚醒並繼續
package com.cppdy; import java.util.concurrent.CyclicBarrier; class MyThread18 extends Thread { private CyclicBarrier cyclicBarrier; public MyThread18(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("開始執行線程"); try { sleep(2000); //第一次進來,表示有一個線程等待,還不滿足三個,不釋放 //第二次進來,也不滿足 //第三次進來,滿足了,就繼續執行下面的代碼 cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println("結束執行線程"); } } public class ThreadDemo18 { public static void main(String[] args) throws Exception { CyclicBarrier cb = new CyclicBarrier(3); MyThread18 my1 = new MyThread18(cb); MyThread18 my2 = new MyThread18(cb); MyThread18 my3 = new MyThread18(cb); my1.start(); my2.start(); my3.start(); System.out.println("主線程執行結束"); } }View Code
Semaphore(信號量)
Semaphore是一種基於計數的信號量,它可以設置一個閥值,多個線程競爭獲取許可信號,做自己的申請後歸還,超過閥值後,線程申請許可信號將會被阻塞
package com.cppdy; import java.util.Random; import java.util.concurrent.Semaphore; class MyThread19 extends Thread { private String name; private Semaphore sp; public MyThread19(String name, Semaphore sp) { this.name = name; this.sp = sp; } @Override public void run() { int availablePermits = sp.availablePermits(); if (availablePermits > 0) { System.out.println(name + ",好開心啊,居然還有坑"); } else { System.out.println(name + ",好傷心啊,怎麽沒有坑了"); } try { sp.acquire(); System.out.println(name + ",好開心啊,終於搶到啦"); //模擬上廁所時間 Thread.sleep(new Random().nextInt(1000)); System.out.println(name + ",好爽啊,終於上完啦"); sp.release(); } catch (Exception e) { e.printStackTrace(); } } } public class ThreadDemo19 { public static void main(String[] args) throws Exception { Semaphore sp = new Semaphore(3); for (int i = 0; i < 10; i++) { MyThread19 mt = new MyThread19("第" + i + "個人", sp); mt.start(); } } }View Code
java多線程快速入門(二十一)