java.util.concurrent.CountDownLatch类基本用法

java.util.concurrent.CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行。

1.构造方法参数指定了计数的次数

2.countDown方法,当前线程调用此方法,则计数减一

3.awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

package cn.baokx;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

class SubThread implements Runnable{
	private CountDownLatch downLatch;
	private String name;

	public SubThread(CountDownLatch downLatch,String name){
		this.downLatch = downLatch;
		this.name = name;
	}

	@Override
	public void run() {
		System.out.println(this.name+" is working...");
		try {
			TimeUnit.SECONDS.sleep(new Random().nextInt(10));
			System.out.println(this.name + " has finished its working...");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			this.downLatch.countDown();
		}
	}
}

public class CountDownLatchTest {
	public static void main(String[] args) {
		CountDownLatch downLatch = new CountDownLatch(4);
		SubThread st1 = new SubThread(downLatch,"subThread1");
		SubThread st2 = new SubThread(downLatch,"subThread2");
		SubThread st3 = new SubThread(downLatch,"subThread3");
		SubThread st4 = new SubThread(downLatch,"subThread4");

		System.out.println("MainThread is wating...");
		new Thread(st1).start();
		new Thread(st2).start();
		new Thread(st3).start();
		new Thread(st4).start();
		try {
			downLatch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("All subThread has finished,MainThread can begin to checking...");
	}
}
时间: 2024-11-05 17:27:24

java.util.concurrent.CountDownLatch类基本用法的相关文章

同步工具类 java.util.concurrent.CountDownLatch

1.类介绍 java.util.concurrent.CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回.这种现象只出现一次--计数无法被重置.如果需要重置计数,请考虑使用 CyclicBarrier. 2.使用场景

java.util.concurrent.CountDownLatch

from when and where: CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下. introduce: CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行. func

使用java.util.concurrent.ThreadFactory类创建线程

工厂设计模式是Java中最常用的设计模式之一.它是一种创建型设计模式,能够用于创建一个或多个类所需要的对象.有了这个工厂,我们就能集中的创建对象. 集中创建方式给我们带来了一些好处,例如: 1. 能够很容易的改变类创建的对象或者创建对象的方式: 2. 能够很容易限制对象的创建,例如:我们只能为a类创建N个对象: 3. 能够很容易的生成有关对象创建的统计数据. 在Java中,我们通常使用两种方式来创建线程:继承Thread类和实现Runnable接口.Java还提供了一个接口,既ThreadFac

java.util.concurrent常用类(CountDownLatch,Semaphore,CyclicBarrier,Future)

CyclicBarrier CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作.假设一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家就等待 . 代码示例: public class UseCyclicBarrier { static class Runner implements Runnable { private CyclicBarrier barrier; private Strin

并发包java.util.concurrent.CountDownLatch

/** * * @描述: 倒计时器 . * 犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计算器为0的时候 * 则所有等待者或单个等待者开始执行 * @作者: Wnj . * @创建时间: 2017年5月15日 . * @版本: 1.0 . */ public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service =

java.util.concurrent CyclicBarrier类

CyclicBarrier类: 原文:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用.因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier.CyclicBarrier支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次.若在继续

Java学习笔记—多线程(并发工具类,java.util.concurrent.atomic包)

在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段.本章会配合一些应用场景来介绍如何使用这些工具类. CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作.假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,

聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁

CountDownLatch闭锁也是基于AQS实现的一种同步器,它表示了"所有线程都等待,直到锁打开才继续执行"的含义.它和Semaphore的语意不同, Semaphore的获取和释放操作都会修改状态,都可能让自己或者其他线程立刻拿到锁.而闭锁的获取操作只判断状态是否为0,不修改状态本身,闭锁的释放操作会修改状态,每次递减1,直到状态为0. 所以正常情况下,闭锁的获取操作只是等待,不会立刻让自己获得锁,直到释放操作把状态变为0. 闭锁可以用来实现很多场景,比如: 1. 某个服务依赖于

Jakob Jenkov 写的 java.util.concurrent API 指南

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类.本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异.