JUC辅助类 CountDownLatch CyclicBarrier Semaphore

本文介绍了Java并发控制的三个重要工具:CountDownLatch、CyclicBarrier和Semaphore。CountDownLatch用于等待多个任务完成,常用于启动主线程等待所有工作线程结束。CyclicBarrier则允许一组线程等待所有线程到达屏障点后一起继续执行,例如7颗龙珠召唤神龙的场景。Semaphore作为信号量,可用于限制同时访问特定资源的线程数量,如限制停车场的停车位。通过这些工具,开发者可以更好地管理和协调并发执行的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CountDownLatch 减法计数器

public class A {

	public static void main(String[] args) {
		//总数是6,必须要执行的任务的时候 使用
		CountDownLatch countDownLatch = new CountDownLatch(6);
		
		for (int i = 0; i < 6; i++) {
			new Thread(()->{
				countDownLatch.countDown();
				System.out.println(Thread.currentThread().getName()+"离开");
			},String.valueOf(i)).start();
		}
		
		//等待计数器归零 在向下执行
		try {
			countDownLatch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("关门");
	}
}
countDownLatch.countDown();  数量减一
countDownLatch.await(); 等待计数器归零,在向下执行

CyclicBarrier 加法计数器

public class CyclicBarrierTest {

	public static void main(String[] args) {
		/**
		 * 7颗龙珠召唤神龙
		 */
		CyclicBarrier barrier = new CyclicBarrier(7,()->{
			System.out.println("召唤神龙成功!");
		}) ;
		
		for (int i = 1; i <= 7; i++) {
			final int temp = i;
			//lambda能操作i么
			new Thread(()->{
				System.out.println(Thread.currentThread().getName()+ ":"+temp);
			
				try {
					barrier.await();
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			},String.valueOf(i)+"线程") .start();
		}
	}
}

barrier.await(); 等待计数器到自定义数量,在向下执行

Semaphore 信号量 (限流)

/**
 * 停车位举例  3个车位 
 * 6个车
 */
public class SemaphoreTest {

	public static void main(String[] args) {
		//需要参数 线程数量
		Semaphore semaphore = new Semaphore(3);
		
		for (int i = 0; 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();
		}
	}
}

semaphore.acquire(); 获取,如果已经满了就等到被释放为止
semaphore.release(); 释放,会将当前信号量释放 ,唤醒等待线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值