`
zhaoningbo
  • 浏览: 609874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java简单实现“主线程等待所有子线程完成再继续”

    博客分类:
  • java
阅读更多
引言:

  在一些项目中,某些时候会引入批量任务。这时常会考虑用多线程并发请求,组装总结果集后再返回前端的处理。便引出一个常见的多线程应用——“主线程等待子线程完成后,才能继续做后续处理”

  对于这一问题常见的解决方式有以下几种:

    1,睡眠。(定时询问)
    2,回调+阻塞。(挂起等被唤醒)
    3,事件+阻塞。(事件驱动模型)
    4,JDK_API。
    5,其它。(废话了;-0)

  本文将介绍一个1.5版后提供的API——“java.util.concurrent.CountDownLatch”。快速实现。

  样例已附于文尾。

正文:

  CountDownLatch有三个主要方法:

    1,CountDownLatch(int count)。
    构造方法。count参数为指定的计数。

    2,countDown()。
    将计数按1步长递减。此时,如果变为零则释放所有等待线程;如果变前为零则无动作;如果大于零则减1。

    3,await()。
    使线程处于等待状态。此时,如果当前计数非零则继续等待;如果是零立即返回。

  由介绍,我们可以设计一个本文议题的解决模型:

  解决模型:

    1,计数者。
    创建两个计数,start(1)、done(N)。可以被主、子线程访问到。

    2,子线程。
    操作前进入start(1).await();
    操作完成后done(N).countDown();

    3,主线程。
    先创建N个子线程并直接启动(子线程进入操作前的start(1).await());
    主线程处理子线程启动前的准备操作后,start(1).countDown()所有子线程立即通过start(0).await();
    主线程处理其他与子线程返回无依赖的操作后,done(N).await()进入等待;
    ...
    所有子线程完成后,都执行了done(N).countDown()此时N变为零;
    主线程继续。

  Java代码的实现非常简单,就不解释了。直接附上源文件于文尾。

     

2
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics