JUC——辅助类
目錄
- CountDownLatch
- CyclicBarrier
- Semaphore
CountDownLatch
減少計數器
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6; i++) //6個上自習的同學,各自離開教室的時間不一致{new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t 號同學離開教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t****** 班長關門走人,main線程是班長");} }CountDownLatch主要有兩個方法,當一個或多個線程調用await方法時,這些線程會阻塞。
其它線程調用countDown方法會將計數器減1(調用countDown方法的線程不會阻塞),當計數器的值變為0時,因await方法阻塞的線程會被喚醒,繼續執行。
CyclicBarrier
public class CyclicBarrierDemo {private static final int NUMBER = 7;public static void main(String[] args) {//CyclicBarrier(int parties, Runnable barrierAction)CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {System.out.println("*****集齊7顆龍珠就可以召喚神龍");});//如果沒有收集到7個,此程序會一直阻塞,不會結束。for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName() + "\t 星龍珠被收集 ");cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}, String.valueOf(i)).start();}} }
字面意思是可循環(Cyclic)使用的屏障(Barrier)。它要做的事情:讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續干活。線程進入屏障通過CyclicBarrier的await()方法。
Semaphore
public class SemaphoreDemo {public static void main(String[] args){Semaphore semaphore = new Semaphore(3);//模擬3個停車位for (int i = 1; i <=6; i++) //模擬6部汽車{new Thread(() -> {try{semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t 搶到了車位");TimeUnit.SECONDS.sleep(new Random().nextInt(5));System.out.println(Thread.currentThread().getName()+"\t------- 離開");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}}, String.valueOf(i)).start();}} }
在信號量上我們定義兩種操作:
acquire(獲取) 當一個線程調用acquire操作時,它要么通過成功獲取信號量(信號量減1),要么一直等下去,直到有線程釋放信號量,或超時。
release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。
信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發線程數的控制。
總結
- 上一篇: js pug 代码_PUG 系列 | 第
- 下一篇: SQL语句值left join,righ