闭锁,栅栏,信号量笔记

分别是juc并发包下的三个辅助类
闭锁:countDownLatch 相当于一个减法计数器
栅栏:cyclicBarrier 相当于一个栅栏,没有多少个线程到达时栅栏不会打开,达到以后才会打开 加法计数器
信号量:semaphore 可以用来限流等操作
countDownLatch简单使用:

CountDownLatch countDownLatch = new CountDownLatch(3);
		for (int i = 0; i < 3; i++) {
    
    
			new Thread(()->{
    
    
				System.out.println("线程"+Thread.currentThread().getName()+"出锁");
				countDownLatch.countDown();//每个线程执行就-1
			},i+"").start();
		}

		try {
    
    
			countDownLatch.await();//次数为0时就执行下边的操作
			System.out.println("关锁");
		} catch (InterruptedException e) {
    
    
			e.printStackTrace();
		}

在这里插入图片描述
cyclicBarrier使用:

CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
    
    
		System.out.println("开始上课");//当有五个线程调用await方法时会执行这个方法
		});
		for (int i = 0; i < 5; i++) {
    
    
			final int t = i;
			new Thread(()->{
    
    
				System.out.println("线程"+Thread.currentThread().getName()+"进入班级");
				try {
    
    
					cyclicBarrier.await();//每次加1
				} catch (InterruptedException e) {
    
    
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
    
    
					e.printStackTrace();
				}
			},t+"").start();
		}

在这里插入图片描述
semaphore使用:

Semaphore semaphore = new Semaphore(3);
		for (int i = 0; i < 6; i++) {
    
    
			final int t = i;
			new Thread(()->{
    
    
				try {
    
    
					semaphore.acquire();//获取信号量标识
					System.out.println("线程"+Thread.currentThread().getName()+"获取到信号量");
					TimeUnit.SECONDS.sleep(2);
				} catch (InterruptedException e) {
    
    
					e.printStackTrace();
				} finally {
    
    
					semaphore.release();
					System.out.println("线程"+Thread.currentThread().getName()+"释放信号量");
				}
			},t+"").start();
		}

在这里插入图片描述

Guess you like

Origin blog.csdn.net/m0_48358308/article/details/110453914