常用的辅助类
常用的輔助類
一、CountDownLath
//計數(shù)器 public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {// 倒計時總數(shù)是6, 必須要執(zhí)行任務(wù)的時候,再使用!CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i < 6; i++) {new Thread(()->{System.out.println(Thread.currentThread().getName() + " GO out");countDownLatch.countDown(); //數(shù)量減1},String.valueOf(i)).start();}countDownLatch.await();// 等待計數(shù)器歸零,喚醒該線程,然后再向下執(zhí)行System.out.println("close Door");} }原理:
? countDownLatch.countDown(); 數(shù)量-1
? countDownLatch.await(); 等待計數(shù)器歸0,再向下執(zhí)行
? 每次有線程調(diào)用countDown()數(shù)量-1,假設(shè)計數(shù)器變?yōu)? , countDownLatch.await()就會被喚醒,繼續(xù)執(zhí)行!
二、CyclicBarrier
CyclicBarrier : 指定個數(shù)線程執(zhí)行完畢再執(zhí)行操作
加法計數(shù)器
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) {/** 集齊7可龍珠召喚神龍* 召喚龍珠的線程* */CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("召喚神龍成功");});for (int i = 1; i <= 7; i++) {int temp = i;// lambda 能操作到i么? 本質(zhì)不能,需要final修飾int temp// 但是jdk1.8之后有優(yōu)化,new Thread(()->{System.out.println(Thread.currentThread().getName()+"收集"+temp+"個龍珠");try {cyclicBarrier.await(); // 等待} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}).start();}} }三、Semaphore
Semaphore:信號量
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; //搶車位! //6車---3個停車位置 public class SemaphoreDemo {public static void main(String[] args) {// 可使用的線程數(shù)量:停車位,限流!Semaphore semaphore = new Semaphore(3);for (int i = 0; i <= 6; i++) {new Thread(()->{// acquire() 得到try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"搶到車位");TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"離開車位");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}// release() 釋放},String.valueOf(i)).start();}} }原理:
semaphore.acquire():獲得,假設(shè)如果已經(jīng)滿了,等待,等待被釋放為止!
semaphore.release():釋放,會將當前的信號量釋放+1,然后喚醒等待的線程!
作用:多個共享資源互斥的使用!并發(fā)限流,控制最大的線程數(shù)
總結(jié)
- 上一篇: 物流配送中商品订货数量的控制技术
- 下一篇: NOD32升级ID