线程池是技术层面的,我同一时间就只有这么多干活的人。而CountDownLatch是事情层面的,我有这么多事儿要干。
所以它的作用就是,在你的多线程任务执行完后,CountDown一下。那么CDL自带的计数器就会减一。
在调用线程中,任务分下去了,要等任务再回来了,就使用一下CDL的await()方法,那么主线程就进入阻塞状态。一直到所有子任务都完成再继续执行。非常容易理解。
还有一点要注意的是。如果钻研不动源码,就先别钻。当代人真的都不缺钉子精神,缺少刨子精神。
另一个常用类是CyclicBarrier。同样是一群人要干活,但现在场景变化,是要当所有人就位后,这些人才会一起干活。
所以在被调用线程里,要排队等号令的线程可以调用一下CB的await(),随后等人(线程)齐了,就一起执行。
第三个常用类是Semaphore,信号量。其实就像一个通行证的池子。当你要用这个线程干一件事儿,那么先去S中拿一个通行证,有证就继续走,没证就阻塞着。干完事儿后,在把通行证还给S,下一个人就有证拿了。
拿证的方法是acquire,还证的方法是release。
这三个方法都常常用在线程的编排之中,实际上但凡多线程场景,必然会有这种编排。所以就是先业务上编排好,先洗菜还是先切菜,还是先啥啥的,这些情况下,可以考虑多使用这些的工具类。
除了以上这些方法外,还有一个更简单的方式,thead.join(),这个方法让当前线程等待thread执行完后继续执行。这和cdl是一样的效果。
网友评论