当前位置:
首页 >
八、JUC强大的辅助类
发布时间:2023/12/20
58
豆豆
生活随笔
收集整理的这篇文章主要介绍了
八、JUC强大的辅助类
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
八、JUC强大的辅助类
文章目录
- 八、JUC强大的辅助类
- 1、CountDownLatch减少计数
- 2、CyclicBarrier循环栅栏
- 3、Semaphore信号灯
- 更多内容:
1、CountDownLatch减少计数
package com.xue.thread;import java.util.concurrent.CountDownLatch;/*** * @Description:* *让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。* * CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。* 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),* 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。* * 解释:6个同学陆续离开教室后值班同学才可以关门。* * main主线程必须要等前面6个线程完成全部工作后,自己才能开干 */ public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6; i++) //6个上自习的同学,各自离开教室的时间不一致{new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t 号同学离开教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t****** 班长关门走人,main线程是班长");} }-
CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。
-
其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),
-
当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。
2、CyclicBarrier循环栅栏
package com.xue.thread;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;/*** ** CyclicBarrier* 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,* 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,* 直到最后一个线程到达屏障时,屏障才会开门,所有* 被屏障拦截的线程才会继续干活。* 线程进入屏障通过CyclicBarrier的await()方法。* * 集齐7颗龙珠就可以召唤神龙*/ public class CyclicBarrierDemo {private static final int NUMBER = 7;public static void main(String[] args){//CyclicBarrier(int parties, Runnable barrierAction) CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{System.out.println("*****集齐7颗龙珠就可以召唤神龙");}) ;for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName()+"\t 星龙珠被收集 ");cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}, String.valueOf(i)).start();}} }-
CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,
-
让一组线程到达一个屏障(也可以叫同步点)时被阻塞,
-
直到最后一个线程到达屏障时,屏障才会开门,所有
-
被屏障拦截的线程才会继续干活。
-
线程进入屏障通过CyclicBarrier的await()方法。
3、Semaphore信号灯
package com.xue.thread;import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;/*** * @Description: TODO(这里用一句话描述这个类的作用) * * 在信号量上我们定义两种操作:* acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),* 要么一直等下去,直到有线程释放信号量,或超时。* release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。* * 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。*/ public class SemaphoreDemo {public static void main(String[] args){Semaphore semaphore = new Semaphore(3);//模拟3个停车位for (int i = 1; i <=6; i++) //模拟6部汽车{new Thread(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t 抢到了车位");TimeUnit.SECONDS.sleep(new Random().nextInt(5));System.out.println(Thread.currentThread().getName()+"\t------- 离开");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}}, String.valueOf(i)).start();}} }在信号量上我们定义两种操作:
- acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时。
- release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
- 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
下一篇:Java内存模型之JMM
更多内容:
更多内容大家可以关注一下个人博客网,https://blog.xueqimiao.com/,内容更丰富喔。
回复JUC可以获取完整md文档喔,谢谢关注。
总结
以上是生活随笔为你收集整理的八、JUC强大的辅助类的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: HDU5128 The E-pang P
- 下一篇: 51单片机 静态数码管显示