并发工具类:倒计时器-CountDownLatch



title: 并发工具类:倒计时器-CountDownLatch
author: Enjoyitlife.top
date: 2019-10-01 10:51:33
summary: JUC包中的工具类CountDownLatch到底给我们提供了什么功能?
categories: Concurrent
tags:

  • Concurrent-Tools

并发工具类:倒计时器-CountDownLatch

CountDownLatch是JDK1.5提供一个并发编程辅助类,用于控制一个和多个线程进行等待,直到其他线程完成后在执行任务。

常用方法:

  • CountDownLatch latch= new CountDownLatch(10); 构造方法,设定计数值,即要等待的线程数量。
  • void countDown() 计数器的值减1,直到为0
  • void await() 阻塞等待,直到计数器的值为0
  • long getCount() 获取当前计数器的值

应用场景 1:实现多个N个线程并行运行

平常用于在创建N个线程来,验证接口的性能。

public class CountDownLatchTest {
    public static void main(String[] args) {
        CountDownLatch latch= new CountDownLatch(5);
        try {
            for(int i=0;i<5;i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        CountDownLatchTest.sayThreadName();
                    }
                }).start();
            }
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    /***
    *模拟真正接口
    */
    public static void sayThreadName() {
        System.out.println(System.currentTimeMillis()+"^^"+Thread.currentThread().getName()+"^^^^");
    }
}

应用场景2:等待N个线程完成任务后在触发其他操作

运动员准备完毕后裁判发令,裁判发令后运动员开始跑步。

public class AthleticMeeting {

    public static void main(String[] args) throws InterruptedException {
        //准备队列
        CountDownLatch readLatch = new CountDownLatch(8);
        //结束队列
        CountDownLatch endLatch = new CountDownLatch(8);
        //教练队列
        CountDownLatch  refereeLatch=new CountDownLatch(1);
        for(int i=0;i<8;i++) {
            final int payerId=i+1;
            Thread thread= new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Long readyCosts=new Double(Math.random()*5000).longValue();
                        Thread.sleep(readyCosts);
                        System.out.println(payerId+"号运动员耗时"+readyCosts+"毫秒准备完毕!");
                        readLatch.countDown();
                        refereeLatch.await();
                        Long runCost=new Double(Math.random()*5000).longValue();
                        Thread.sleep(runCost);
                        System.out.println(payerId+"号运动员耗时"+runCost+"毫秒完成比赛!");
                        endLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }
        readLatch.await();
        System.out.println("所有运动员准备完毕!");
        refereeLatch.countDown();
        System.out.println("裁判发动发令枪!");
        endLatch.await();
        System.out.println("比赛完成!");
    }
}

原文地址:https://www.cnblogs.com/enjoyitlife/p/11763793.html

时间: 2024-11-05 17:33:29

并发工具类:倒计时器-CountDownLatch的相关文章

多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)

package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchDemo implements Runnable { static final

四、线程的并发工具类

线程的并发工具类 一.CountDownLatch [1]CountDownLatch是什么? CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行: 确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 等待直到某个操作所有参与者都准备就绪再继续执行

25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger

1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行.当然,使用线程间消息通信机制也可以完成.其实,java并发工具类中为我们提供了类似"倒计时"这样的工具类,可以十分方便的完成所说的这种业务场景. 为了能够理解CountDownLatch,举一个很通俗的例子,运动员进行跑

Java并发工具类 - CountDownLatch

Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html 官方API. CountDownLatch能够使一个或多个线程等待其他线程完成各自的工作后再执行:CountDownLatch是JDK 5+里面

并发工具类:CountDownLatch、CyclicBarrier、Semaphore

在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch 1 import java.util.concurrent.CountDownLatch; 2 3 4 public class CountDownLatchTest 5 { //设置N为2 6 static CountDownLatch c = new CountDownLatch(2); 7 p

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public CountDownLatch(int count) //count 计数个数 例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理 public class CountDownLatchDemo implements Runnable{ private stat

Java并发编程系列-(2) 线程的并发工具类

2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了分而治之的思想:什么是分而治之?规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解. 具体使用中,需要向ForkJoinPool线程池提交一个ForkJoinTask任务.ForkJoinTask任务有两个重要

并发工具类

问题:Thread.join的代码如下,为什么没有加锁却可以wait?另外下面的代码说明线程结束的时候会signal正在wait的线程,实际是signalAll(). while(isAlive()){ wait(0); } 并发工具类(提供超时等重载方法,含有查询线程排队和统计的接口) 1.CountDownLatch 1.不能重复使用 2.相当于Thread.join() 3.调用countdown方法happens-before,另外一个线程调用await方法. 2.CyclicBarri

Java并发工具类CyclicBarrier

CyclicBarrier同步屏障 java并发工具类中有一个叫做CyclicBarrier的类,与CountDownLatch类似,都可以实现线程间的同步,但是差别是CyclicBarrier是可重置的同步屏障. 想象一个场景,有N个人不同时间走到一扇门,因为门需要N个人合力才能推开,所以人不足N个时,只能阻塞在此,等到N个人都到了之后,可以推开门,继续进行之前的工作.CyclicBarrier就是这扇门. 看看下面的代码,定义了一个线程数为2的,CyclicBarrier,并在主线程和另外一