日期:2014-05-20  浏览次数:20721 次

线程池怎么让主线程知道所有子线程已经执行完成
线程池怎么让主线程知道所有子线程已经执行完成?
如题,
一个线程池有5个线程,我想要主线程等待所有子线程执行完,主线程在继续执行,
请问怎么解决?

------解决方案--------------------
主线程做个while true循环判断所有的子线程!isAlive()
------解决方案--------------------
不知道你的线程池的实现是自写还是使用JDK提供的java.util.concurrent.ThreadPoolExecutor。

如果是JDK提供的线程池。可以去判断getPoolSize()是否等于或者小于池的核心线程数量corePoolSize。当然这种情况下也存在陷阱,一就是核心线程数量无法确定是否在空闲状态,只有将corePoolSize设置为0,才能正确判断。二就是线程池对空闲线程的销毁存在一个keepAliveTime,只有要将keepAliveTime减小到你getPoolSize的频率时,可能才能正确判断。并且如果使用ThreadPoolExecutor,对于池中的线程,你无法针对某一个线程进行操作。

我的感觉,你现在的需求不符合使用线程池的需求,你需要的是一个线程管理类而不是池。

------解决方案--------------------
java.util.concurrent.CyclicBarrier
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用。

牢记一点:当要解决任何线程问题时,优先考虑api提供的工具。
------解决方案--------------------
顶四楼。
不清楚主线程是不是可以挂起,如果可以,可以在子线程可行的位置将主线程挂起,当子线程逻辑结束后,再将主线程唤醒。
仅做猜测,不可定论。
------解决方案--------------------
这好办啊, 把主线程睡在 线程池的对象上, 当任务线程执行完后在看看我是执行完成的第几个,如果是最后一个, 那么我就可以叫醒主线程了