最近因为一个需求接触到了CountDownLatch:一个界面的渲染需要多个接口返回的数据,所以接口全部返回才能执行渲染操作。
通过一个例子理解CountDownLatch:
利用CountDownLatch等待子线程全部执行完
妈妈有四个孩子,到午餐时间,妈妈需要等待孩子们全部吃完才开始收拾碗筷,每个孩子吃完就会告诉妈妈“我吃完啦”,当四个孩子全吃完了,妈妈开始收拾。
与CountDownLatch的对应关系:妈妈代表主线程,四个孩子代表子线程,每个子线程的任务就是吃饭,妈妈等待四个孩子吃完代表妈妈定义了一个CountDownLatch,传入的计数参数为4,妈妈等待表示主线程调用了CountDownLatch.await()方法,“我吃完啦”表示子线程任务执行完并调用了CountDownLatch.countDown()方法,当四个孩子全部吃完后代表CountDownLatch的计数达到了设置值4,则await方法取消阻塞,妈妈开始收拾。
利用CountDownLatch阻塞子线程控制同时启动
妈妈的四个孩子都很乖,妈妈给他们盛好饭菜后让他们开始吃他们才会开始吃。
对应关系:同样妈妈和孩子分别是主线程和子线程,准备好饭将孩子都安排入座表示子线程都已经定义好,妈妈和孩子的默契表示主线程向每个子线程传了一个设置计数值为1的CountDownLatch对象,孩子吃饭前等妈妈的指令表示四个子线程执行了CountDownLatch.await() 方法阻塞等待,妈妈一声令下执行了CountDownLatch.countDown()方法,四个子线程的计数达到设置值1,同时取消阻塞开始吃饭。