多线程

  • 主线程等待子线程结束

    在很多时候,我们期望实现这么一种功能:在主线程中启动一些子线程,等待所有子线程执行结束后,主线程再继续执行。比如:老板分配任务,众多工人开始工作,等所有工人完成工作后,老板进行检查。

    解决方法分析:

    1. 主线程通过join等待所有子线程完成后,继续执行;
    2. 主线程知道子线程的数量、未完成子线程数量,主线程等待所有子线程完成后,才继续执行。

    3. 再谈CountDownLatch

        java.util.concurrent.CountDownLatch是JDK 1.5提供的一个同步辅助类:在一组正在其他线程中的操作执行完成之前,它允许一个或多个线程一直等待。

        初始化CountDownLatch时需要指定计数。通过调用countDown方法使当前计数到达零之前,await方法会一直阻塞。之后,所有等待的线程会被释放,await后面的操作也会立即执行。因为计数无法被重置,所以这种操作只会出现一次。如果需要重置计数,请考虑使用java.util.concurrent.CyclicBarrier。

    4. 再谈CyclicBarrier

        java.util.concurrent.CyclicBarrier也是JDK 1.5提供的一个同步辅助类(为什么用也呢?参见再谈CountDownLatch),它允许一组线程互相等待,直到到达某个临界点(a common barrier point,翻译成公共障碍点、公共栅栏点都不够传神,直接用临界点吧)。在某个程序中,一组固定大小的线程必须互相等待时,CyclicBarrier将起很大的作用。因为在等待线程被释放后,这个临界点可以重用,所以说是循环的。