countdownlatch如何实现java主线程等待子线程执行完毕之后再执行

countdownlatch  时间:2021-06-16  阅读:()

countdownlatch和synchronized的区别

CountDownLatch 1、类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

用给定的计数 初始化 CountDownLatch。

由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。

之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。

这种现象只出现一次——计数无法被重置。

一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行 2、使用场景 在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。

这个时候就可以使用CountDownLatch。

CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。

1.synchronized的意义 synchronized用于多线程设计,有了synchronized关键字,多线程程序的运行结果将变得可以控制。

synchronized关键字用于保护共享数据。

2.synchronized实现同步的机制 synchronized依靠"锁"机制进行多线程同步,"锁"有2种,一种是对象锁,一种是类锁。

3.此下面2种是依靠对象锁锁定,初始化一个对象时,自动有一个对象锁。

synchronized {普通方法}依靠对象锁工作,多线程访问ynchronized方法,一旦某个进程抢得锁之后,其他的进程只有排队对待。

synchronized void method{}功能上,等效于 void method{ synchronized(this) } } synchronized {修饰代码块}的作用不仅于此,synchronized void method{}整个函数加上synchronized块,效率并不好。

在函数内部,可能我们需要同步的只是小部分共享数据,其他数据,可以自由访问,这时候我们可以用 synchronized(表达式){//语句}更加精确的控制。

4.synchronized {static方法}此代码块等效于 void method{ synchronized(Obl.class) } } 使用该类的类对象的锁定去做线程的共享互斥. 5.synchronized {run方法}run方法的锁定. 这个举例比较好说。

public class MyThread implement Runnable{ public void run(){ for(int i=0;i<10;i++){ System.out.println(i+" "); } } } 如果在主程序多线程运行 MyThread t=new MyThread (); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); 其结果是混乱不堪的。

如果加了synchronized当前线程取完所有数据后,才会释放锁,所以结果可以预知。

4个线程输出总是0,1...9

countdownlatch怎么读

countdown latch 的读法 countdown 单词音标是: 英[?ka?ntda?n] 美[?ka?nt?da?n] latch 单词音标是: 英[l?t?] 美[l?t?]

如何解决java接口访问ZooKeeper时的connectionloss错误

常见错误日志如下: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss 1. 原因: 是因为ZooKeeper建立连接时采用异步操作,连接操作后并不能保证ZK连接已成功。

如果在ZK连接成功前的这个小时间窗口去访问ZK,就会碰到如上错误。

2. 解决思路 我们在新建ZK连接后要等一段时间,保证连接成功后再访问ZK。

3. 网上比较赞同的解决方案: 主要利用两个Java类: (1)java.util.concurrent.CountDownLatch: 一个同步辅助类,类似倒数计数,直到计数器为0时才能对资源“解锁”。

未解锁前等待该资源的进程只能被阻塞。

主要方法: public CountDownLatch(int count); /* 构造函数,参数指定计数次数 */ public void countDown(); /* 当前线程调用此函数,则计数减一 */ public void await() throws InterruptedException; /* 此函数会一直阻塞当前线程,直到计时器的值为0为止 */ (.apache.zookeeper.Watcher ZooKeeper有一个很有用的功能,就是集群上每一个变化都可以通知到自定义的Watchcer。

来来来,用java写个线程,启动运行,然后判断它是否在执行,如果没有在执行则启动它,谁来写个简单滴

package?test; import?java.util.concurrent.CountDownLatch; import?java.util.concurrent.Executor; import?java.util.concurrent.Executors; public?class?WatchThread?{ public?void?testThread()?throws?InterruptedException?{ int?threadNum?=?10; //?初始化countDown CountDownLatch?threadSignal?=?new?CountDownLatch(threadNum); //?创建固定长度的线程池 Executor?executor?=?Executors.newFixedThreadPool(threadNum); for?(int?i?=?0;?i?<?threadNum;?i++)?{?//?开threadNum个线程 Runnable?task?=?new?TestThread(threadSignal); //?执行 executor.execute(task); } threadSignal.await();?//?等待所有子线程执行完 //?do?work System.out.println(Thread.currentThread().getName()?+?""); } /** *?测试函数 */ public?static?void?main(String[]?args)?throws?InterruptedException?{ WatchThread?test?=?new?WatchThread(); test.testThread(); } private?class?TestThread?implements?Runnable?{ private?CountDownLatch?threadsSignal; public?TestThread(CountDownLatch?threadsSignal)?{ this.threadsSignal?=?threadsSignal; } public?void?run()?{ System.out.println(Thread.currentThread().getName()?+?"开始..."); //?do?shomething System.out.println("开始了线程::::"?+?threadsSignal.getCount()); //?线程结束时计数器减1 threadsSignal.countDown(); System.out.println(Thread.currentThread().getName()?+?"结束.?还有" +?threadsSignal.getCount()?+?"?个线程"); } } }

怎么让它到这里停止,等主线任务线程里的任务全做完

要实现这个情况,必须知道以下几点1、java中线程的结束是由run方法运行完成后自动结束的2、在main线程(主线程)中,需要得到所有线程的引用。

3、知道jdk提供的CountDownLatch的用法例子如下:publicstaticvoidmain(String[]args)throwsInterruptedException{//CountDownLatch作为计数器纪录有几个线程,例如有2个线程CountDownLatchlatch=newCountDownLatch(2);Workerworker1=newWorker(latch);Workerworker2=newWorker(latch);worker1.start();//启动线程worker2.start();////等待所有工人完成工作latch.await();System.out.println("allworkdoneat"+sdf.format(newDate()));}classWorkerextendsThread{privateCountDownLatchlatch;publicWorker(CountDownLatchlatch){this.latch=latch;}publicvoidrun(){xxxxx//在run方法结束之前,讲线程计数器减一latch.countDown();}}

如何实现java主线程等待子线程执行完毕之后再执行

java.util.concurrent.CountDownLatch 这个类可以实现你所要的功能 例如:CountDownLatch latch = new CountDownLatch(5) //声明计数器为5个 Thread t = new Thread() { public void run() { try { //TODO 你的应用 } catch (Exception e) { //TODO 异常处理 } finally { latch.countDown(); //这句是关键 System.out.println("ok"); //5个线程都跑完后输出 } } }; t.start(); 然后让以上操作循环五次(就是说同时开5个线程),那么这个"ok"就会在等到这5个线程都ok后才会被输出一次。

如何低价香港服务器购买?有没有便宜的香港服务器推荐?

如何低价香港服务器购买?想要做一个个人博客,想用香港服务器,避免繁琐备案,性能不需要多高,只是记录一些日常而已,也没啥视频之类的东西,想问问各位大佬有没有低价的香港服务器推荐?香港距大陆近,相比美国服务器最大的优势在于延迟低,ping值低,但是带宽紧张,普遍都是1M,一般戏称其为“毛细血管”。同时价格普遍高,优质稳定的一般价格不菲。大厂云梯队阿里云、腾讯云两家都有香港服务器,要注意的是尽量不要选择...

百星数据(60元/月,600元/年)日本/韩国/香港cn2 gia云服务器,2核2G/40G/5M带宽

百星数据(baixidc),2012年开始运作至今,主要提供境外自营云服务器和独立服务器出租业务,根据网络线路的不同划分为:美国cera 9929、美国cn2 gia、香港cn2 gia、韩国cn2 gia、日本cn2 gia等云服务器及物理服务器业务。目前,百星数据 推出的日本、韩国、香港cn2 gia云服务器,2核2G/40G/5M带宽低至60元/月,600元/年。百星数据优惠码:优惠码:30...

统计一下racknerd正在卖的超便宜VPS,值得推荐的便宜美国VPS

racknerd从成立到现在发展是相当迅速,用最低的价格霸占了大部分低端便宜vps市场,虽然VPS价格便宜,但是VPS的质量和服务一点儿都不拉跨,服务器稳定、性能给力,尤其是售后方面时间短技术解决能力强,估计这也是racknerd这个品牌能如此成功的原因吧! 官方网站:https://www.racknerd.com 多种加密数字货币、信用卡、PayPal、支付宝、银联、webmoney,可...

countdownlatch为你推荐
旺旺群发阿里旺旺如何群发信息?youtube创始人卜秋静 有关生平介绍yui3YUI最详细的资料flash序列号flash激活序列号是?aviconverter介绍一个好用的免费的avi转换器btest进入北大青鸟需要什么学历呢手机在线客服怎样和oppo客服在线交流手机在线客服手机客服热线flv转avi有什么软件可以把flv文件转成avi文件?wap服务中国联通用户怎么才能使用WAP服务
安徽双线服务器租用 免费国际域名 如何注册网站域名 免费网络电视 网通服务器ip panel1 gg广告 速度云 鲁诺 ebay注册 免费个人主页 中国联通宽带测速 免费个人网页 亿库 发证机构 饭桶 29美元 泥瓦工 ddos攻击器 电脑主机响 更多