大家好,今天给各位分享final countdown是什么意思、读音的一些知识,其中也会对多线程基础系列之 CountDownLatch进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
很久以前面试大厂,被面试官问到有没有使用过CountDownLatch,我说使用过;面试官追问,那你可以说一下具体使用场景吗,脑袋一懵,竟然答不上来。是的,我背的八股文已经忘了,之前我也确实没有使用过。
最近碰到有一个同事错误地使用了CountdownLatch,不由的想谈一谈CountdownLatch的使用。
同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行(Asynchronizationaidthatallowsoneormorethreadstowaituntilasetofoperationsbeingperformedinotherthreadscompletes.)
有了上面理解,接下来再看看应用场景
举几个实际应用用到的例子,不会使用CountDownLatch的请抄作业了。
//1.设置CountDownLatch\nfinalCountDownLatchlatch=newCountDownLatch(1);\nfinalRpcResultresult=newRpcResult();\n\n//2.发起远程RPC调用。RPC返回结果,触发callback调用,修改CountDownLatch\nremoteInvoke(getHost(requestLine),request,newCallBack(timeout){\n@Override\npublicvoidhandled(Responseresponse)throwsException{\ntry{\nResponse.Statusstatus=response.startLine();\nbyte[]bytes=response.body().bytes();\n......\nresult.setStateCode(status.code());\n}catch(Exceptione){\nresult.setCause(t);\n}finally{\n//必须放在final里面\nlatch.countDown();\n}\n}\n});\n
可以把remoteInvoke理解为线程操作。
很多框架的源码启动类,都会有异步加载过程并同步等待,就是下面这个模板代码,试着在你的工程中用一用。
finalCountDownLatchlaunchLatch=newCountDownLatch(1);\nThreadlauncherThread=newThread(()->{\ntry{\n.......\n}finally{\nlaunchLatch.countDown();\n}\n});\n.....\nlatch.await(timeout,TimeUnit.MILLISECONDS);\n多线程等
多线程等待的场景,比如并发下载,并发查询等等
finalCountDownLatchlatch=newCountDownLatch(nTasks);\nfor(inti=0;i<nTasks;++i){\nexecutorService.submit(\nnewRunnable(){\n@Override\npublicvoidrun(){\ntry{\n//业务操作method\n}finally{\nlatch.countDown();\n}\n}\n});\n}\nlatch.await();\n补充场景启动类,异步加载资源源码中的注释也有两个详细的例子三、其他补充源码浅析
内部实现一个AbstractQueuedSynchronizer(AQS队列同步器),源码并不多,主要,通过改变privatevolatileintstate值来实现线程之间的协助。state不为0继续等待,为0向下执行。调用countDown则state减一
学会慢慢的把这些工具类应用到你的工程里面,别再做CRUDboy了。
纸上得来终觉浅,绝知此事要躬行.
作者:uzong链接:https://juejin.cn/post/7307857918594334758
OK,本文到此结束,希望对大家有所帮助。