`
bestree007
  • 浏览: 10294 次
社区版块
存档分类
最新评论

CountDownLatch介绍

 
阅读更多

CountDownLatch是java.util.concurrent并发包中提供的一个可用于控制多线程同时开始某动作的类。其采用的方式为减计数的方式。当计数减至零时,位于await后的代码才会执行。

CountDownLatch(int)

    创建内部类Sync的对象实例,并将state设置为传入的参数。

  await()

     调用Sync继承的AbstractQueuedSynchronizer 的acquireShareInterruptibly完成。

acquireShareInterruptibly首先调用Sync的tryAcquireShared方法,该方法判断当前的state是否为零。如果为零,则返回1,否则返回-1。如果返回1,则await直接返回,如果返回-1,则将此线程放入队列进行等待,知道tryAcquireSharedfan返回-1或线程被interrupt

countdown()

调用Sync的tryReleaseShared方法,如果state不为零,基于CAS将state的值设置为减1后的值;如果减1后的值为零,则返回true,否则返回false

如果为true,则通知所有在队列等待的线程。

下面是一个例子

package DownTest;

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

public class CountDownLatchDemo {
private static final int PLAYER_AMOUNT = 5;

public CountDownLatchDemo() {
// TODO Auto-generated constructor stub
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 对于每位运动员,CountDownLatch减1后即结束比赛
CountDownLatch begin = new CountDownLatch(1);
// 对于整个比赛,所有运动员结束后才算结束
CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
Player[] plays = new Player[PLAYER_AMOUNT];

for (int i = 0; i < PLAYER_AMOUNT; i++)
plays[i] = new Player(i + 1, begin, end);

// 设置特定的线程池,大小为5
ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
for (Player p : plays)
exe.execute(p); // 分配线程
System.out.println("Race begins!");
begin.countDown();

try {
end.await();

// 等待end状态变为0,即为比赛结束
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
} finally {
System.out.println("Race ends!");
}
exe.shutdown();

}
}
对于Player类如下
package DownTest;

import java.util.concurrent.CountDownLatch;


public class Player implements Runnable {

     private int id;
     private CountDownLatch begin;
     private CountDownLatch end;
     public Player(int i, CountDownLatch begin, CountDownLatch end) {
         // TODO Auto-generated constructor stub
         super();
         this.id = i;
         this.begin = begin;
         this.end = end;
     }

     @Override
     public void run() {
         // TODO Auto-generated method stub
         try{
             begin.await();        //等待begin的状态为0
             Thread.sleep((long)(Math.random()*100));    //随机分配时间,即运动员完成时间
             System.out.println("Play"+id+" arrived.");
         }catch (InterruptedException e) {
             // TODO: handle exception
             e.printStackTrace();
         }finally{
             end.countDown();    //使end状态减1,最终减至0
         }
     }
}

 执行结果:

Race begins!
Play2 arrived.
Play3 arrived.
Play5 arrived.
Play4 arrived.
Play1 arrived.
Race ends!

分享到:
评论

相关推荐

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    J.U.C-AQS框架同步组件之闭锁CountDownLatch介绍

    CountDownLatch是Java并发编程中的一个重要工具,它属于Java并发包`java.util.concurrent`下的一个类。这个类的主要功能是让一个或多个线程等待其他线程完成特定的任务,然后才能继续执行。CountDownLatch的设计基于...

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

    本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 CountDownLatch的应用场景: CountDownLatch是一个非常有用的线程控制工具,它可以使一个线程等待其他线程达到某一目标后进行自己的下...

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

    本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`。MyBatis的批处理功能允许我们在一次数据库连接中执行多条SQL语句,从而减少了数据库连接的...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...

    JAVA多线程CountDownLatch使用详解

    下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。 什么时候用CountDownLatch? 在多线程编程中,我们经常会遇到这样一种情况:某个线程需要等待其他线程执行完毕后再继续执行。例如,在上面的代码中,...

    Java中的CountDownLatch类最全讲义

    1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 2.3 countDown()方法 实现多线程任务的同步 3.1 场景介绍 3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 ...

    CountDownLatch、Semaphore等4大并发工具类详解

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    SpringBoot CountDownLatch多任务并行处理的实现方法

    本篇文章主要介绍了 SpringBoot 中使用 CountDownLatch 实现多任务并行处理的方法。CountDownLatch 是 Java 中的一种同步工具,允许一个或多个线程等待其他线程完成任务。下面我们将详细介绍如何使用 CountDownLatch...

    java利用CountDownLatch实现并行计算

    本文将主要介绍 Java 中如何利用 CountDownLatch 实现并行计算,并提供了一个详细的示例代码。 一、什么是 CountDownLatch? CountDownLatch 是 Java 中的一个同步工具类,它可以帮助我们实现并行计算。...

    JAVA CountDownLatch(倒计时计数器)用法实例

    本文将详细介绍 CountDownLatch 的用法实例,通过示例代码来讲解其使用方法。 CountDownLatch 的主要方法 CountDownLatch 有两个主要方法:countDown() 和 await()。 1. countDown() 方法: public void ...

    JAVA CountDownLatch与thread-join()的区别解析

    JAVA 中的线程同步机制是非常重要的,CountDownLatch 和 thread-join() 是两种常用的线程同步方法,本文将详细介绍它们之间的区别。 首先, thread-join() 方法是Java语言中提供的一种线程同步机制,当一个线程调用...

    java并发编程专题(八)----(JUC)实例讲解CountDownLatch

    本篇文章主要介绍了Java中的CountDownLatch类,作为Java并发编程专题(八)的一部分,通过实例讲解帮助读者理解和学习。下面是文章中的知识点总结: 一、CountDownLatch简介 CountDownLatch是一个同步辅助类,允许...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    本文将详细介绍这三个辅助类的用法和实例详解。 一、CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。它可以让一个线程等待其他线程执行完毕后再执行。...

    thread count

    #### 一、CountDownLatch 基础介绍 `CountDownLatch` 可以被视为一种同步辅助工具,它的主要功能是允许一个或多个线程等待其他线程完成某些操作。具体来说,`CountDownLatch` 维护了一个内部计数器(初始值由用户...

    Java并发工具类示例

    本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...

    多线程计数实现多线程执行后再执行主线程

    #### 二、`CountDownLatch`概念介绍 `CountDownLatch`是Java并发包中的一个类,它是一个同步工具类,用于控制当前线程等待其他线程完成各自的工作后再继续执行。它通过一个计数器来实现这一功能:当计数器的值为0时...

    java并发之并发工具类

    Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...

    Java多线程--等待所有子线程执行完的五种方法.docx

    本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`方法 尽管不推荐,但可以通过`Thread.sleep()`方法让主线程休眠一段时间来等待子线程。这种方法的问题在于,睡眠时间必须预估...

Global site tag (gtag.js) - Google Analytics