并发编程的同步器,java并发库的线程同步类
CountDownLatch
在日常开发中,经常会遇到需要在主线程中打开多个线程并行执行任务,主线程需要等待所有子线程执行完毕后再进行汇总。在CountDownLatch出现之前,总是使用线程的join()方法来实现这一点,但是join方法不够灵活,无法满足不同场景的需求,所以JDK开发团队提供了CountDownLatch这个类,我们之前介绍的例子使用CoumtDownLatch会更加优雅。
使用CountDownLatch 的代码如下:
包锁定支持测试;导入Java . util . concurrent . countdownlatch;public类JoinCountDownLatch { private static volatile CountDownLatch CountDownLatch=new CountDownLatch(2);public static void main(String[]args)抛出interrupted exception { Thread threadOne=new Thread(new Runnable(){ @ Override public void run(){ try { Thread . sleep(1000);子线程结束!);} catch(interrupted exception e){ e . printstacktrace();} finally { countdownlatch . count down();} } });Thread Thread two=new Thread(new Runnable(){ @ Override public void run(){ try { Thread . sleep(1000));子线程结束!);} catch(interrupted exception e){ e . printstacktrace();} finally { countdownlatch . count down();} } });thread one . start();thread two . start();等待所有子线程结束!);countdownlatch . await();所有子线程结束!);}}
在上面的代码中,创建了CountDownLatch的一个实例。因为有两个子线程,所以构造函数的参数是2。调用countDownLatch.await()方法后,主线程将被阻塞。当子线程完成执行时,它调用countDownLatch.countDown()方法将countDownLatch中的计数器减1。当所有子线程执行完毕并调用countDown()方法时,计数器将变为0,然后主线程的await()方法返回。实际上,上面的代码不够优雅。在项目实践中,一般避免直接操作线程,而是使用ExceutorService线程池进行管理。使用ExcsuIwsnise时,传递的参数是可运行或可调用的对象。此时不能直接调用这些线程的join()方法,需要选择使用CountDownLatch。
将上面的代码修改为:
包锁定支持测试;导入Java。util。并发。countdownlatch导入Java。util。并发。遗嘱执行人;导入Java。util。并发。执行服务;导入Java。util。并发。遗嘱执行人;公众的类joincountdownlatch 2 { private static volatile CountDownLatch CountDownLatch=new CountDownLatch(2);公共静态void main(String[]args)抛出中断异常{ ExecutorService ExecutorService=executors。newfixedthreadpool(2);执行服务。submit(new Runnable(){ @ Override public void run(){ try { thread。睡眠(1000));子线程结束!);} catch(中断异常e){ e . printstacktrace();}最后是{ countdownlatch。倒计时();} } });执行服务。submit(new Runnable(){ @ Override public void run(){ try { thread。睡眠(1000));子线程二结束!);} catch(中断异常e){ e . printstacktrace();}最后是{ countdownlatch。倒计时();} } });等待所有子线程结束!);countdownlatch。await();所有子线程结束!);执行服务。关闭();}}
最后总结一下闭锁与加入()的区别。一个区别是,调用一个子线程的加入()方法后,该线程会一直被阻塞直到子线程运行完毕,而闭锁则使用计数器来允许子线程运行完毕或者在运行中递减计数,也就是CountDownLach可以在子线程运行的任何时候让等待()方法返回而不一定必须等到线程结東。另外,使用线程池来管理线程时一般都是直接添加可运行的到线程池,这时候就没有办法再调用线程的加入方法了,就是说coundownllatch相比加入方法让我们对线程同步有更灵活的控制。
到此这篇关于爪哇并发编程同步器闭锁的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。