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后才会被输出一次。

ParkInHost - 俄罗斯VPS主机 抗投诉 55折,月付2.75欧元起

ParkInHost主机商是首次介绍到的主机商,这个商家是2013年的印度主机商,隶属于印度DiggDigital公司,主营业务有俄罗斯、荷兰、德国等机房的抗投诉虚拟主机、VPS主机和独立服务器。也看到商家的数据中心还有中国香港和美国、法国等,不过香港机房肯定不是直连的。根据曾经对于抗投诉外贸主机的了解,虽然ParkInHost以无视DMCA的抗投诉VPS和抗投诉服务器,但是,我们还是要做好数据备...

热网互联33元/月,香港/日本/洛杉矶/韩国CN2高速线路云主机

热网互联怎么样?热网互联(hotiis)是随客云计算(Suike.Cloud)成立于2009年,增值电信业务经营许可证:B1-20203716)旗下平台。热网互联云主机是CN2高速回国线路,香港/日本/洛杉矶/韩国CN2高速线路云主机,最低33元/月;热网互联国内BGP高防服务器,香港服务器,日本服务器全线活动中,大量七五折来袭!点击进入:热网互联官方网站地址热网互联香港/日本/洛杉矶/韩国cn2...

6元虚拟主机是否值得购买

6元虚拟主机是否值得购买?近期各商家都纷纷推出了优质便宜的虚拟主机产品,其中不少6元的虚拟主机,这种主机是否值得购买,下面我们一起来看看。1、百度云6元体验三个月(活动时间有限抓紧体验)体验地址:https://cloud.baidu.com/campaign/experience/index.html?from=bchPromotion20182、Ucloud 10元云主机体验地址:https:...

countdownlatch为你推荐
短信营销方案短信平台应该如何推广和运营啊?ico监管新加坡代币ICO备案怎么做怎么查微信注册时间微信号用了多久,怎么知道怎样删除聊天记录自己已发出的微信聊天记录怎样删除才不会让对方看见泛微协同办公系统泛微软件怎么样?做协同办公的,我要来这做销售前景怎么样?请大家对这个行业或公司了解的给些建议。cc防火墙web防火墙有什么作用微盟价格虚拟币的价格由什么决定西安娱乐西安市最刺激好玩的娱乐场所是哪里?元宝汇传奇续章开了几个区?data什么意思c语言 data的作用
西安域名注册 t牌 Vultr bluehost payoneer 20g硬盘 网站保姆 realvnc ev证书 ibrs 合肥鹏博士 最好的空间 云全民 蜗牛魔方 河南m值兑换 刀片服务器的优势 100m空间 速度云 河南移动网 厦门电信 更多