`

CountDownLatch的例子

 
阅读更多
public class StatsDemo {
    final static SimpleDateFormat sdf = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");
    
    final static String startTime = sdf.format(new Date());

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(5);// 两个赛跑者
        Stats stats1 = new Stats("任务A", 1000, latch);
        Stats stats2 = new Stats("任务B", 2000, latch);
        Stats stats3 = new Stats("任务C", 2000, latch);
        Stats stats4 = new Stats("任务D", 2000, latch);
        Stats stats5 = new Stats("任务E", 2000, latch);
        stats1.start();//任务A开始执行
        stats2.start();//任务B开始执行
        stats3.start();//任务C开始执行
        stats4.start();//任务D开始执行
        stats5.start();//任务E开始执行
        latch.await();// 等待所有人任务结束
        System.out.println("所有的统计任务执行完成:" + sdf.format(new Date()));
    }

    static class Stats extends Thread {
        String statsName;
        int runTime;
        CountDownLatch latch;

        public Stats(String statsName, int runTime, CountDownLatch latch) {
            this.statsName = statsName;
            this.runTime = runTime;
            this.latch = latch;
        }

        public void run() {
            try {
                System.out.println(statsName+ " do stats begin at "+ startTime);
                //模拟任务执行时间
                Thread.sleep(runTime);
                System.out.println(statsName + " do stats complete at "+ sdf.format(new Date()));
                latch.countDown();//单次任务结束,计数器减一
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
由于要同步返回统计数据,这里我们使用到了CountDownLatch类,它是Java5中新增的一个并发工具类,其使用非常简单,参考上面的伪代码给出了详细的使用步骤。

CountDownLatch用于同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成。CountDownLatch典型的用法是将一个程序分为N个互相独立的可解决任务,并创建值为N的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    - 使用CountDownLatch实现多线程并行计算,最后汇总结果的例子。 - 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和...

    利用 CountDownLatch 类实现线程同步

    在这个例子中,3个线程分别执行任务,每个任务完成后调用 `countDown()`。主线程调用 `await()` 阻塞,直到计数器归零,表明所有线程已完成任务,主线程继续执行后续操作。 总的来说,`CountDownLatch` 是一种有效...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    在上面的例子中, CountDownLatch被用来模拟百米赛跑的场景,其中八名运动员同时起跑,由于速度的快慢,肯定会出现先到终点和晚到终点的情况,而终点有个统计成绩的仪器,当所有选手到达终点时,它会统计所有人的...

    CountDownLatch详解.docx

    这个例子展示了 CountDownLatch 如何帮助协调多线程间的同步。等待线程通过调用 `await()` 方法阻塞自己,直到所有工作线程完成它们的 `run()` 方法,调用 `countDown()`。一旦计数器达到0,所有等待的线程将被释放...

    Java并发包之CountDownLatch用法.docx

    在这个例子中,`CountDownLatchTest`的主方法创建了3个线程模拟3位乘客登机,`CountDownLatch`的计数器初始化为3。当所有乘客登机完成后,主线程会继续执行并宣布飞机起飞。 `CountDownLatch`在并行任务拆分和优化...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    例如,在篮球比赛的例子中,控球后卫(主线程)等待所有球员到位后才开始进攻。 ```java CountDownLatch countDownLatch = new CountDownLatch(5); // 5位球员 // 模拟球员到位 for (int i = 0; i ; i++) { ...

    Java中CountDownLatch用法解析

    在上述例子中,它被用来模拟一场有5位运动员的比赛,确保所有运动员都准备好后比赛才开始,并且所有运动员都完成比赛后比赛才结束。 首先,我们来看一下`CountDownLatch`的基本原理。构造`CountDownLatch`时需要...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在上述的百米赛跑例子中,CountDownLatch被巧妙地应用了。`CountDownLatch(int count)`构造函数接收一个初始计数值,表示需要等待的线程数量。每个线程完成任务后,调用`countDown()`方法使计数值减一,直到计数值减...

    CountDownLatch同步工具类使用详解

    在上面的例子中,我们使用CountDownLatch来控制线程的执行顺序,使得主线程等待代表选手的线程执行完成后再执行。我们可以看到,通过CountDownLatch的使用,我们控制了线程的执行顺序。在上面的代码中,我们使用到...

    并发编程之Tools&CountDownLatch&Semaphore原理与应用1

    举个例子,假设我们有n个子线程需要完成任务,主线程可以使用CountDownLatch来等待所有子线程完成。当所有子线程调用`countDown()`后,主线程的`await()`方法将返回,表明所有子任务都已结束。 总结,Semaphore和...

    Java开发宝典的所有例子

    5. **多线程**:Java支持多线程编程,例子会介绍Thread类的使用、线程同步方法(如synchronized关键字、wait()、notify()等)以及并发工具类如Semaphore、CountDownLatch等。 6. **网络编程**:Java的Socket编程...

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

    在`CountDownLatchDemo1`的例子中,展示了5个线程代表5个工人,每个工人完成检查后,`countDown()`会使计数器减1。主线程调用`await()`方法,直到计数器归零,表示所有检查都完成,然后继续执行后续任务。 **...

    Java中多线程同步类 CountDownLatch

    以下是一个简单的使用CountDownLatch的例子: ```java import java.util.concurrent.CountDownLatch; public class TestThread extends Thread { CountDownLatch cd; String threadName; public TestThread...

    java线程并发countdownlatch类使用示例

    这个例子展示了`CountDownLatch`如何协调多个线程的执行顺序,确保在所有预设任务完成后,主任务才能继续执行。在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接...

    Java线程并发工具类CountDownLatch原理及用法

    CountDownLatch更适合于一次性使用的场景,用于让一个线程等待其他线程完成特定操作,而CyclicBarrier则适用于多轮迭代的场景,让一组线程在每轮开始前等待所有线程到达同一位置。了解并熟练运用这些工具,能有效...

    zookeeper-watcher- 简单例子

    CountDownLatch latch = new CountDownLatch(1); // 注册Watcher,监听数据节点 zookeeper.getData(PATH, true, (__, stat) -> { System.out.println("数据节点已更改"); latch.countDown(); }, new Stat());...

    JAVA例子100

    15. **并发编程**:讲解线程池的使用、并发工具类如Semaphore、CountDownLatch等,以及并发容器如ConcurrentHashMap。 16. **Lambda表达式和函数式编程**:介绍JDK 8引入的Lambda表达式,以及Stream API的使用,...

    java例子程序源代码

    线程和并发处理也是Java的强项,你可能会找到多线程创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait/notify、Lock接口)、并发工具类(如ExecutorService、Semaphore、CountDownLatch)的实例...

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

    举个例子,假设我们有5个子线程需要同时启动并执行一项工作,而主线程需要等待所有子线程工作完成后才继续执行。这时,我们可以在主线程中创建一个初始值为5的CountDownLatch,每个子线程执行完工作后调用`countDown...

    Concurrent包的小例子

    Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等

Global site tag (gtag.js) - Google Analytics