CountDownLatch
作用:
- 允许一个或多个线程等待其他线程完成操作
构造:
- CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完
成,这里就传入N。
使用:
- 当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法
会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个
点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个
CountDownLatch的引用传递到线程里即可。 - 如果有某个解析sheet的线程处理得比较慢,我们不可能让主线程一直等待,所以可以使
用另外一个带指定时间的await方法——await(long time,TimeUnit unit),这个方法等待特定时
间后,就会不再阻塞当前线程。join也有类似的方法。
注意:
- 计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会
阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数
器的值。一个线程调用countDown方法happen-before,另外一个线程调用await方法。
应用
游戏加载
:多人加载,只有所有人全部加载成功后,才可以开始游戏。多方信息汇总时
:只有多方信息全部获取到,才可以进行显示。
交互
- 虽然CountDownLatch很方便,但是它只能在线程池内线程中使用查询的数据,对主线程是不可见的(其他线程访问不到)
- 所以为了在其他线程可以使用在线程内部的数据,就可以使用Future类(线程执行的返回结果);在线程没有执行完之前,不会结束主线程。同样可以达到CountDownLatch的效果。