公司建站文案给网站公司看的,卸载ghost版wordpress,上海网网站建设,为什么重装电脑没有wordpress一入王者深似海#xff0c;从此对象是路人。哈喽观众老爷们大家好#xff0c;我是战神吕布字奉先#xff0c;今天给大家来一部吕布的教学视频#xff01;咳咳#xff0c;不对。大家好#xff0c;我是磊哥#xff0c;今天给大家来一篇 CountDownLatch 的文章。在开始之前… 一入王者深似海从此对象是路人。哈喽观众老爷们大家好我是战神吕布字奉先今天给大家来一部吕布的教学视频咳咳不对。大家好我是磊哥今天给大家来一篇 CountDownLatch 的文章。在开始之前先问大家一个非常专业的技术性问题打团战最怕_____?一道非常简单的送分题如果答不对那磊哥就要批评你了哈哈。可能有人会说打团战最怕猪队友但比猪队友更可怕的是打团战人不齐啊兄弟想想在打团时如果是 5V2 是怎么一幅画面心痛到不敢想????????♀️。等人齐再团磊哥在儿子没有出生之前也是资深的农药玩家至于段位吗别问问就是青铜。虽然磊哥的段位不是很高但基本的大局观还是有的毕竟也是打过几年 Dota 和 LOL 的青铜玩家是吧哈哈。农药和其他 Moba 类游戏是一样的想要取胜必须要把握好每次团战而每次团战的关键在于等人齐了再开团是吧而这个思想正好和咱们要讲得 CountDownLatch 的思想是一致的咱们来看看是怎么回事吧。吾有上将“CountDownLatch”想象一下这样一个场景当我们需要等待某些线程执行完之后再执行主线程的代码要怎么实现可能有人会说简单用 join() 方法等待线程执行完成之后再执行主线程就行了实现代码是这样的// 创建线程1
Thread t1 new Thread(new Runnable() {Overridepublic void run() {// do something}
});
t1.start();// 创建线程2
Thread t2 new Thread(new Runnable() {Overridepublic void run() {// do something}
});
t2.start();// 等待线程 1和线程 2 执行完
t1.join();
t2.join();
当然如果使用的是 Thread 来执行任务那这种写法也是可行的。然而真实的编码环境中我们是不会使用 Thread 来执行多任务的而是会使用线程池来执行多任务这样可以避免线程重复启动和销毁所带来的性能开销实现代码如下// 创建固定线程数的线程池
ExecutorService executorService Executors.newFixedThreadPool(2);
// 任务一
executorService.submit(new Runnable() {Overridepublic void run() {// do something}
});
// 任务二
executorService.submit(new Runnable() {Overridepublic void run() {// do something}
});
那么这时候问题来了线程池是没有 join() 方法的那要怎么实现等待呢这个时候就要派出我方大将“CountDownLatch”啦。吾有上将潘凤可斩华雄... 出场数秒潘凤...“卒”。等等导演我觉得剧情应该是这样的...CountDownLatch使用为了实现等待所有线程池执行完之后再执行主线程的逻辑我决定使用 AQSAbstractQueuedSynchronizer抽象同步框架下的著名类 CountDownLatch 来实现此功能具体的实现代码如下public static void main(String[] args) throws InterruptedException {// 创建 CountDownLatchCountDownLatch countDownLatch new CountDownLatch(2);// 创建固定线程数的线程池ExecutorService executorService Executors.newFixedThreadPool(2);// 任务一executorService.submit(new Runnable() {Overridepublic void run() {// do somethingtry {// 让此任务执行 1.2sThread.sleep(1200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(我是任务一);countDownLatch.countDown();}});// 任务二executorService.submit(new Runnable() {Overridepublic void run() {// do somethingtry {// 让此任务执行 1.2sThread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(我是任务二);countDownLatch.countDown();}});// 等待任务执行完成countDownLatch.await();System.out.println(程序执行完成~);
}
以上程序执行结果如下从上述结果可以看出主线程的执行是等待任务一和任务二都执行完成之后才执行的。CountDownLatch实现原理CountDownLatch 中 count down 是倒数的意思latch 则是门闩的含义。整体含义可以理解为倒数的门栓似乎有点“321芝麻开门”的感觉CountDownLatch 的作用也正是如此。CountDownLatch 在创建的时候需要传入一个整数在这个整数“倒数”到 0 之前主线程需要一直挂起等待直到其他的线程都执行之后主线才能继续执行。CountDownLatch执行流程CountDownLatch 的实现是在其内部创建并维护了一个 volatile 类型的整数计数器当调用 countDown() 方法时会尝试将整数计数器 -1当调用 wait() 方法时当前线程就会判断整数计数器是否为 0如果为 0则继续往下执行如果不为 0则使当前线程进入等待状态直到某个线程将计数器设置为 0才会唤醒在 await() 方法中等待的线程继续执行。CountDownLatch常用方法// 线程被挂起直到 count 值为 0 才继续执行
public void await() throws InterruptedException { }; // 和 await() 类似只不过等待一定的时间后 count 值还没变为 0 的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; // 将 count 值减 1
public void countDown() { };
总结使用 CountDownLatch 可以实现等待所有任务执行完成之后再执行主任务的功能它就好像比赛中要等待所有运动员都完成比赛之后再公布排名一样当然我们在玩农药的时候也是一样要等所有人集合完毕之后再开团这是制胜的关键。而 CountDownLatch 是通过计数器来实现等待功能的当创建 CountDownLatch 时会设置一个大于 0 的计数器每次调用 countDown() 方法时计数器的值会 -1直到计数器值变为 0 时等待的任务就可以继续执行了。参考 鸣谢www.jianshu.com/p/128476015902