`
锅巴49
  • 浏览: 160883 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CountDownLatch的用法/等待多线程执行结果

阅读更多

在前面一篇博文http://guoba6688-sina-com.iteye.com/blog/724536中提出如何更方便的等待多线程执行结果,该篇博文的做法是

//等待线程执行完毕   
        while(threadPool.getActiveCount() > 0){   
            try{   
                Thread.sleep(1000);   
            }catch(Exception e){   
                e.printStackTrace();   
            }   
        }   

 

今天发现java类库中的CountDownLatch可以很方便的完成这个工作

 

CountDownLatch的原理时

1、先设一个线程数,通过构造函数。

2、启动线程后,调用await()方法等待内部保持的线程数归零

3、每个线程在完成后调用countDown(),将活动的线程数减1

4、当活动线程数归零后,执行下面的代码

 

 

附上代码

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * CountDownLatch  的用法
 *
 * @author 锅巴
 * @version 1.0 2010-8-9
 */
public class Main {

    private ExecutorService pool;
    private int threadCount = 10;
    private CountDownLatch countDownLatch;
    
    public static void main(String[] args) throws InterruptedException {
        
        Main main = new Main();
        main.execute();
       
        System.out.println("Main is end ");
        
//        System.exit(0);
    }
    
    public Main(){
        threadCount = 10;
        pool = Executors.newFixedThreadPool(threadCount);
        //初始化线程数
        countDownLatch = new CountDownLatch(threadCount);
    }
    
    public void execute() throws InterruptedException{
        for(int i=0; i<threadCount; i++){
            pool.execute(new Handler(10,countDownLatch));
        }
        pool.shutdown();
        //等待线程执行完成
        //实现上是等待count变成0
        countDownLatch.await();
       
    }
    
    
    class Handler implements Runnable {
       
        private int count;
        
        private CountDownLatch countDownLatch;

        public Handler(int count,CountDownLatch countDownLatch) {
            this.count = count;
            this.countDownLatch = countDownLatch;
        }

        public void run() {
            // read and service request
            for(int i=0; i<count; i++){
                System.out.println(Thread.currentThread().getName() + " : " + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            //当本线程完成就减1
            countDownLatch.countDown();
        }
    }
}

 

0
0
分享到:
评论
1 楼 mercyblitz 2010-08-09  
CountDownLatch并不是用户等待线程执行结束的,它是控制一定数量的线程执行。

要想得到结果,当线程运行完毕,要利用Future,或者ExecutorCompletionService。

相关推荐

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入

    java使用CountDownLatch等待多线程全部执行完成

    主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    利用 CountDownLatch 类实现线程同步

    利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949

    多线程countDownLatch方法介绍

    NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451

    如何使用CountDownLatch同步java多线程

    主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    CountDownLatch学习用法

    在网上找的一个CountDownLatch的学习demo,感觉很不错,就摘抄过来了

    CountDownLatch和CyclicBarrier用法实例大全

    《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品需要进行质检,5个工人进行检查,所有...

    JAVA多线程CountDownLatch使用详解

    主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java中CountDownLatch进行多线程同步详解及实例代码

    主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下

    java大批量导入excel,多线程加分片处理的dome

    然后,创建一个固定数量的线程池,使用 CountDownLatch 控制主线程等待所有任务完成;最后,循环迭代分片区间,将分片任务提交到线程池中处理。在每个任务中,使用 ReadRowHolder 对象实现分片读取 Excel 数据,并...

    Java中的CountDownLatch类最全讲义

    主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 等待多个资源就绪 CountDownLatch与CyclicBarrier的对比 最佳实践与...

    Java并发包之CountDownLatch用法.docx

    CountDownLatch计数器闭锁是一个能阻塞主线程,让其他线程满足特定条件下主线程再继续执行的线程同步工具。 Latch闭锁的意思,是一种同步的工具类。类似于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭着的,不...

    thread count

    浅析Java中CountDownLatch用法 CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。下面以一个模拟运动员比赛的例子加以说明。 ...

    详解Java多线程编程中CountDownLatch阻塞线程的方法

    在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:

    Java多线程之并发工具类

     1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——...

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    CyclicBarrier用法.docx

    它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都到达这个屏障时,所有线程才能继续执行。与CountDownLatch不同的是,...

    多线程相关代码(V3)

    多线程相关的(具体包括Lock synchronized Join ThreadLocal Executors CountDownLatch等)一些demo。

Global site tag (gtag.js) - Google Analytics