第8章 JUC-辅助类
作者:互联网
8.1 减少计数CountDownLatch
CountDownLatch类可以设置一个计数器,然后通过countDown方法来进行减1的操作,使用await方法等待计数器不大于0 ,然后继续执行await方法之后的语句。
● CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞
● 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)。
● 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。
场景: 6个同学陆续离开教室后值班同学才可以关门。
CountDownLatchDemo
package JUC.jucAssist; import java.util.concurrent.CountDownLatch; //演示 CountDownLatch public class CountDownLatchDemo { //6个同学陆续离开教室之后,班长才可以锁门 public static void main(String[] args) throws InterruptedException { //创建CountDownLatch对象,设置初始值 CountDownLatch countDownLatch = new CountDownLatch(6); //6个同学陆续离开教室 for (int i = 1; i <= 6; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+" 号同学离开了教室"); //计数 -1 countDownLatch.countDown(); },String.valueOf(i)).start(); } //等待 countDownLatch.await(); System.out.println(Thread.currentThread().getName()+ " 班长锁门走人了"); } }
8.2 循环栅栏CycliBarrier
CyclicBarrier看英文单词可以看出大概就是循环阻塞的意思,在使用中CyclicBarrier的构造方法第一个参数是目标障碍数,每次执行CyclicBarrier 一次障碍数会加一,如果达到了目标障碍数,才会执行cyclicBarrier.awai()之后的语句。可以将CyclicBarrier理解为加1操作。
场景:集齐7颗龙珠就可以召唤神龙
CyclicBarrierDemos
package JUC.jucAssist; import java.util.concurrent.CyclicBarrier; //集齐7颗龙珠就可以召唤神龙 public class CyclicBarrierDemo { //创建固定值 private static final int NUMBER = 7; public static void main(String[] args) { //创建CyclicBarrier CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER,() -> { System.out.println("*****集齐7颗龙珠就可以召唤神龙"); }); //集齐七颗龙珠过程 for (int i = 1; i <= 7; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+ " 星龙珠被收集到了!"); try { cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } },String.valueOf(i)).start(); } } }
8.3 信号灯Semaphore
package JUC.jucAssist; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; //6辆汽车,停3个车位 public class SemaphoreDemo { public static void main(String[] args) { //创建Semaphore,设置许可数量 Semaphore semaphore = new Semaphore(3); //创建6辆汽车 for (int i = 1; i <= 6; i++) { new Thread(() -> { //抢占 try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+" 抢到了车位"); //设置随机停车时间 TimeUnit.SECONDS.sleep(new Random().nextInt(5)); System.out.println(Thread.currentThread().getName()+" ---离开了车位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //释放 semaphore.release(); } }, String.valueOf(i)).start(); } } }
标签:JUC,辅助,String,System,CountDownLatch,println,CyclicBarrier,public 来源: https://www.cnblogs.com/RobertYu666/p/16218801.html