Java多线程-----理解CountDownLatch

   CountDownLatch简介 

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存

在于java.util.concurrent包下。CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行

CountDownLatch工作原理

CountDownLatch.java类中定义的构造函数:public CountDownLatch(int count)

 构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。

与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个

方法上阻塞,直到其他线程完成各自的任务。其他N 个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知

机制是通过 CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调 用了这个方法,

count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务

使用CountDownLatch实例

package com.thread.countdownlatch;

import java.util.concurrent.CountDownLatch;

/**
 * CountDownLatch :闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行
 *
 * @author yyx 2019年1月14日
 */
public class CountDownLatchDemo {
    public static void main(String[] args) {
        //所有线程公用一个CountDownLatch对象
        CountDownLatch latch = new CountDownLatch(20);
        LatchDemo ld = new LatchDemo(latch);

        long start = System.currentTimeMillis();

        for (int i = 0; i < 20; i++) {
            new Thread(ld).start();
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
        }
        long end = System.currentTimeMillis();

        System.out.println("耗费时间为:" + (end - start));
    }
}

class LatchDemo implements Runnable {
    private CountDownLatch latch;

    public LatchDemo(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < 50000; i++) {
                if (i % 2 == 0) {
                    System.out.println(i);
                }
            }
        } finally {
            latch.countDown();
        }
    }
}

原文地址:https://www.cnblogs.com/fengfuwanliu/p/10267431.html

时间: 2024-09-30 13:28:59

Java多线程-----理解CountDownLatch的相关文章

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

Java多线程理解(线程安全)

我们在使用Java多线程时,一定需要考虑到共享,线程安全的相关内容.以下通过几个例子帮助大家来理解多线程时如何运行的,后续通过一篇文章详述解决办法:synchronized. 场景1: 第一次运行结果: [当前线程]----------one=====实例变量的值----x=1 [当前线程]----------two=====实例变量的值----x=2 [当前线程]----------two=====实例变量的值----x=3 [当前线程]----------two=====实例变量的值----

【Java多线程】CountDownLatch同步辅助类

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法: public CountDownLatch(int count);  //构造方法参数, 指定了计数的次数 public void countDown();        //调用此方法,则计数减一 public void await();        //调用此方法会一直阻塞当前线程,直到计时器的值为0 代码: import java.util.concurren

java多线程对CountDownLatch的使用实例

介绍 CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行. 用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数. 每次调用CountDown(),计数减1 主程序执行到await()函数会阻塞等待线程的执行,直到计数为0 实现原理 计数器通过使用锁(共享锁.排它锁)实现 实例1 场景:模拟10人赛跑.10人跑完后才喊"Game Over." package com.jihite; import java

Java多线程:CountDownLatch、CyclicBarrier 和 Semaphore

场景描述: 多线程设计过程中,经常会遇到需要等待其它线程结束以后再做其他事情的情况,比如多线程下载文件,每个线程都会下载文件的一部分,在所有线程结束以后,需要将各部分再次拼接成一个完整的文件. 有几种方案: 1.在主线程中设置一自定义全局计数标志,在工作线程完成时,计数减1.主线程侦测该标志是否为0,一旦为0,表示所有工作线程已经完成. 2.使用Java标准的类CountDownLatch来完成这项工作,原理是一样的,计数. CountDownLatch 一个同步辅助类,在完成一组正在其他线程中

java多线程理解及实现

其实多线程也很好理解,就好比我们坐高铁.飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码 线程实现的三种方式: 一.继承Thread类创建线程类 1.定义Thread子类,重写run()方法,把需要做线程操作的类容放入该方法体中. 2.创建Thread子类的实例,在实例中调用线程对象的start()启动线程方法,此方法也是代表线程数量的方法,需要启动多个线程时,只需要调用多次则以. package com.thread; public cla

java多线程理解与实现方式

1.通过继承thread类,覆写run方法来实现多线程. 1 public class Mytest { 2 public static void main(String[] args) { 3 Thread myThread1 = new MyThread1(); 4 Thread myThread2 = new MyThread1(); 5 //调用start方法 6 myThread1.start(); 7 myThread2.start(); 8 //调用run方法 9 //myThre

java多线程理解2

1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见另一个线程做的更改. 为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的.这归因于java语言规范的内存 模型 小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致 2. 什么叫原子的(原子操作)? Java原子操作是指:不会被打断地的操作.(就是做到互斥和可见性?

Java多线程理解

首先说一下进程和线程的区别 进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立: 线程:cpu执行的基本单位,拥有独立的寄存器和栈,同一进程下的线程共享地址&内存空间:线程栈存放方法的栈帧,每次方法执行都会新建栈帧压到栈顶,当线程中某个请求大小超过限制则提示StackOverflowError,当需要存储一个新的栈帧且栈内存不足则抛出OutOfMemoryError:栈帧包含局部变量.返回值.方法引用的常量池(栈帧只能存