①. CountDownLatch(闭锁) 做减法
- ①. CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞
- ②. 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)
- ③. 计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行
//需求:要求6个线程都执行完了,mian线程最后执行 public class CountDownLatchDemo { public static void main(String[] args) throws Exception{ CountDownLatch countDownLatch=new CountDownLatch(6); for (int i = 1; i <=6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t"); countDownLatch.countDown(); },i+"").start(); } countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"\t班长关门走人,main线程是班长"); } }
④. 利用枚举减少if else的判断
public enum CountryEnum { one(1,"齐"),two(2,"楚"),three(3,"燕"), four(4,"赵"),five(5,"魏"),six(6,"韩"); private Integer retCode; private String retMessage; private CountryEnum(Integer retCode,String retMessage){ this.retCode=retCode; this.retMessage=retMessage; } public static CountryEnum getCountryEnum(Integer index){ CountryEnum[] countryEnums = CountryEnum.values(); for (CountryEnum countryEnum : countryEnums) { if(countryEnum.getRetCode()==index){ return countryEnum; } } return null; } public Integer getRetCode() { return retCode; } public String getRetMessage() { return retMessage; } }
/* 楚 **国,被灭 魏 **国,被灭 赵 **国,被灭 燕 **国,被灭 齐 **国,被灭 韩 **国,被灭 main **秦国一统江湖 * */ public class CountDownLatchDemo { public static void main(String[] args) throws Exception{ CountDownLatch countDownLatch=new CountDownLatch(6); for (int i = 1; i <=6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t"+"**国,被灭"); countDownLatch.countDown(); },CountryEnum.getCountryEnum(i).getRetMessage()).start(); } countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"\t"+"**秦国一统江湖"); } }
⑤. 实验CountDownLatch去解决时间等待问题
public class AtomicIntegerDemo { AtomicInteger atomicInteger=new AtomicInteger(0); public void addPlusPlus(){ atomicInteger.incrementAndGet(); } public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(10); AtomicIntegerDemo atomic=new AtomicIntegerDemo(); // 10个线程进行循环100次调用addPlusPlus的操作,最终结果是10*100=1000 for (int i = 1; i <= 10; i++) { new Thread(()->{ try{ for (int j = 1; j <= 100; j++) { atomic.addPlusPlus(); } }finally { countDownLatch.countDown(); } },String.valueOf(i)).start(); } //(1). 如果不加上下面的停顿3秒的时间,会导致还没有进行i++ 1000次main线程就已经结束了 //try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) {e.printStackTrace();} //(2). 使用CountDownLatch去解决等待时间的问题 countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"\t"+"获取到的result:"+atomic.atomicInteger.get()); } }