JUC类下的3个常用工具类

JUC类下的3个常用工具类

1. CountDownLatch

让一些线程阻塞知道另一些线程完成一系列的操作之后被唤醒
CountDownLatch 主要有两个方法 当一个或多个线程调用await方法时,调用线程会被阻塞,其他线程调用countDown方法会将计数器减1 (调用countDown方法的线程不会阻塞)
当计数器的值变为0的时候被await的线程会被唤醒

下面是一个关于CountDownLatch的Demo

情景 : 教师里有6名同学 保安在6名同学都走了之后才能关门

class CountDownLatchDemo{
     
	public static void main(String[] args) throws InterruptedException {
     
        CountDownLatch cdLock = new CountDownLatch(5);
        for(int i = 1 ; i < 6 ; i++){
     
            new Thread(()->{
     
                System.out.println(Thread.currentThread().getName()+"同学离开了教室");
                cdLock.countDown();
            },String.valueOf(i)).start();
        }
        //保安开始关门
        cdLock.await();
        System.out.println("保安关门了哦!!!!");
    }
}

运行结果:

1同学离开了教室
2同学离开了教室
3同学离开了教室
4同学离开了教室
5同学离开了教室
保安关门了哦!!!!

2.CyclicBarrier

字面意思:循环屏障
理解: 铁甲小宝 集齐12颗和平星 就能召唤神龙
就相当于是CountDownLatch的 “ 反向抽烟 ” 版

	public static void main(String[] args){
     
	CyclicBarrier cyclicBarrier = new CyclicBarrier(12,()->{
     
		System.out.println("召唤神龙!!!!!");
	}
	for(int i = 1; i<= 12; i++){
     
		finan int tempInt = i;
		new Thread(()->{
     
			System.out.println(Thread.currentThread().getName()+ i + " 和平星 ");
			cyclicBarrier.await();
		})
	}
}

Thread-0 和平星
Thread-1 和平星
Thread-2 和平星
Thread-3 和平星
Thread-4 和平星
Thread-5 和平星
Thread-6 和平星
Thread-7 和平星
Thread-8 和平星
Thread-9 和平星
Thread-10 和平星
Thread-11 和平星
召唤神龙!!!!!

3.Semaphore

信号量 主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制

理解 : 抢车位
多个线程抢多个资源
也能实现公平和非公平的锁 再构造器中实现

public static void main(String[] args){
     
	Semaphore semaphore = new Seaphore(3); //模拟了3个停车的位置
	for(int i = 0; i <= 6; i++){
     
		new Thread(()->{
     
			semaphore.acquire();
			System.out.println(Thread.currentThread().getName()+" 抢到了车位");
			Thread.sleep(1000);//车停了1s就走了
			semaphore.relaease();
		}).start();
	}
}

你可能感兴趣的:(JUC高并发,thread,多线程,并发编程,jvm,java)