JUC-常用工具类使用
Semaphore 信号量
构造方法参数,指定信号量资源的总数
acquire方法,获得1个信号量资源,如果信号量满了,需要等待资源释放
release方法,释放1个信号量资源,然后通知其他等待的线程
常用于多个线程对同一个共享资源的互斥处理,可以做流量限流
代码示例:
6辆车,3个车位,抢车位
public class SemaphoreTest { public static void main(String[] args) { /** * 6辆车,3个停车位 */ 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(1); System.out.println(Thread.currentThread().getName() + "号车离开停车位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 释放资源 semaphore.release(); } }, String.valueOf(i)).start(); } } }
CountDownLatch减法计数器
构造方法,指定计数器初始容量
countDown()方法,计数器容量减1
await()方法,等待技术器值归零,计数器归零之后,才能执行该代码后面的代码
public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { // 减法计数器,参数是int类型 CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 1; i <= 6; i++) { new Thread(()-> { // 计数器执行减一操作 System.out.println(Thread.currentThread().getName() + " go out"); countDownLatch.countDown(); }, String.valueOf(i)).start(); } // 等待计数器归零,才能执行下面的代码 countDownLatch.await(); System.out.println("close door"); } }
CyclicBarrier加法计数器
构造方法,参数1指定需要达到的线程数量,参数二,Runnable接口实现类,如果达到了要求数量会执行Runnable接口中的run方法
await()方法,等待线程数量达到指定数量,达到之后,执行参数二中的业务
代码实现:
集齐七颗龙珠,召唤神龙
public class CyclicBarrierTest { public static void main(String[] args) { // 两个参数,参数1,指定需要达到线程数量,参数2,线程数量达到后,执行Runnable中的run方法 CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{ System.out.println("集齐七颗龙珠,召唤神龙"); }); for (int i = 1; i <= 7; i++) { final int temp = i; new Thread(()-> { System.out.println("集齐第一颗龙珠" + temp); try { // 等到cyclicBarrier指定的线程数量达到7,就执行cyclicBarrier中指定写好的线程逻辑 cyclicBarrier.await(); System.out.println("没到7不会执行这里的代码"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } }#JUC#