ToB企服应用市场:ToB评测及商务社交产业平台

标题: JUC的强大辅助类 [打印本页]

作者: 莫张周刘王    时间: 2024-1-7 02:48
标题: JUC的强大辅助类
JUC的强大辅助类

juc中提供了常用的辅助类,通过这些辅助类,可以很好的解决线程数量过多时,Lock锁的频繁操作这三种辅助类为:
减少计数器(CountDownLatch)


CountDownLatch类可以设置一个计数器,然后通过countDown方法来进行-1操作,使用await方法等待计数器的值{//                System.out.println(Thread.currentThread().getName() + "位同学离开教室");//            },String.valueOf(i + 1)).start();//        }//        System.out.println(Thread.currentThread().getName() + "班长锁门了");        //第一步,创建计数器,定义初始值        CountDownLatch countDownLatch = new CountDownLatch(6);        for (int i = 0; i < 6; i++) {            new Thread(() ->{                //需要执行的代码,一定要写在进行-1操作前,因为计数器的值一旦变为0,就会立刻唤醒,因其await()等待的线程,                //写在之后的话,可能就会出现,主线程执行,其他线程才执行的情况                //第二步,执行线程需要的操作                System.out.println(Thread.currentThread().getName() + "位同学离开教室");                //第三步,进行-1操作                countDownLatch.countDown();//对设定的初始值,进行-1操作            },String.valueOf(i + 1)).start();        }        //第四步,使其他线程等待        countDownLatch.await();        System.out.println(Thread.currentThread().getName() + "班长锁门了");    }}[/code]循环栅栏(CyclicBarrier)

CyclicBarrier是循环阻塞的意思,在使用中,Cyclic构造方法,第一个参数是目标数,每次执行CyclicBarrier一次,目标数会+1,只有达到了目标数,才会执行,传入的第二个参数barrierAction 中的run方法。可以将CyclicBarrier.await()看作一次目标数+1并且阻塞当前线程的复合操作,且该阻塞方法,是在目标数达成后,统一唤醒因该方法阻塞的线程,继续执行执行每个线程的操作。
案例及代码实现
  1. /**
  2. * @author 长名06
  3. * @version 1.0
  4. * 演示CountDownLatch
  5. */
  6. public class CountDownLatchDemo {
  7.     //6位同学,陆续离开教室后,班长才锁门
  8.     public static void main(String[] args) throws InterruptedException {
  9. //  此代码不能实现案例要求,因为mian线程和新增的线程间不是互斥状态,并行执行,
  10. //  很可能班长已经锁门,但是还有同学未离开教室
  11. //        for (int i = 0; i < 6; i++) {
  12. //            new Thread(() ->{
  13. //                System.out.println(Thread.currentThread().getName() + "位同学离开教室");
  14. //            },String.valueOf(i + 1)).start();
  15. //        }
  16. //        System.out.println(Thread.currentThread().getName() + "班长锁门了");
  17.         //第一步,创建计数器,定义初始值
  18.         CountDownLatch countDownLatch = new CountDownLatch(6);
  19.         for (int i = 0; i < 6; i++) {
  20.             new Thread(() ->{
  21.                 //需要执行的代码,一定要写在进行-1操作前,因为计数器的值一旦变为0,就会立刻唤醒,因其await()等待的线程,
  22.                 //写在之后的话,可能就会出现,主线程执行,其他线程才执行的情况
  23.                 //第二步,执行线程需要的操作
  24.                 System.out.println(Thread.currentThread().getName() + "位同学离开教室");
  25.                 //第三步,进行-1操作
  26.                 countDownLatch.countDown();//对设定的初始值,进行-1操作
  27.             },String.valueOf(i + 1)).start();
  28.         }
  29.         //第四步,使其他线程等待
  30.         countDownLatch.await();
  31.         System.out.println(Thread.currentThread().getName() + "班长锁门了");
  32.     }
  33. }
复制代码
信号灯(Semaphore)

Semaphore的构造方法,中传入的第一个参数是最大信号量(可以看作线程池中的最大线程数),每个信号量初始化的数目,也就是能分发的最大许可证,使用acquire()方法,获取许可证,release()方法释放许可证。
案例及代码实现
  1. /**
  2. * @author 长名06
  3. * @version 1.0
  4. * 演示循环栅栏CyclicBarrier
  5. * 集齐七颗龙珠案例
  6. */
  7. public class CyclicBarrierDemo {
  8.     //集齐七颗龙珠
  9.     private static final int NUMBER = 7;
  10.     public static void main(String[] args) {
  11.         //第一步,设定目标数,且指定目标数达成后,要执行的方法
  12.         CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
  13.             System.out.println("七颗龙珠被集齐了");
  14.         });
  15.         for (int i = 1; i <= 7; i++) {
  16.             new Thread(() -> {
  17.                 try {
  18.                     System.out.println(Thread.currentThread().getName() + "星龙珠被收集到了");
  19.                     //第二步+1,且阻塞线程
  20.                     cyclicBarrier.await();
  21.                     System.out.println(Thread.currentThread().getName() +"测试");
  22.                 } catch (InterruptedException e) {
  23.                     e.printStackTrace();
  24.                 } catch (BrokenBarrierException e) {
  25.                     e.printStackTrace();
  26.                 }
  27.             },String.valueOf(i)).start();
  28.         }
  29.     }
  30. }
复制代码
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4