欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

八、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强大的辅助类的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。