`
bo_hai
  • 浏览: 565885 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

CountDownLatch 应用实例

 
阅读更多

参考:http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html

  在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后此行,从jdk1.5开始就可以使用CountDownLatch实现,    
  CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器 减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
 下面举一个等车的例子:
 10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开:

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

public class Student {
	private int myNum;
	public Student(int num) {
		this.myNum = num;
	}
	
	public boolean getOn() throws InterruptedException {
		//Thread.currentThread().sleep(new Random().nextInt(2) * 1000);// 小朋友上车是需要时间的
		//TimeUnit.MICROSECONDS.sleep(new Random().nextInt(2) * 1000);// JDK1.5 后使用这个方式
		TimeUnit.SECONDS.sleep(2);
		if (CountDownLatchTest.isGone) {
			return false;
		}
		System.out.print("编号为:"+myNum+"的同学上车了..");
		return true;
	}
}

 

import java.util.concurrent.CountDownLatch;

public class GetOn implements Runnable {

	private CountDownLatch		countDownLatch;
	
	public GetOn(CountDownLatch		countDownLatch) {
		this.countDownLatch = countDownLatch;
	}
	
	@Override
	public void run() {
		for (int i = 0; i < CountDownLatchTest.numberOfPeople; i++) {
			try {
				if (CountDownLatchTest.isGone) {
					 System.out.println("还差:"+countDownLatch.getCount()+" 个没娃上车呢.怎么车走了");
					 break;
				} 
				boolean goonSuccess = new Student(i + 1).getOn();//顺序上车
				if (goonSuccess) {
					// 每当小朋友上车成功后,就调用 countDown() 进行减1操作
					countDownLatch.countDown();
				}
			} catch (InterruptedException  e) {}
			if (countDownLatch.getCount() != 0) {
				System.out.println("还差:"+(countDownLatch.getCount())+" 个没上车");
			} else {
				System.out.println("都上车了");
			}
		}
	}
}

 

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

public class CountDownLatchTest {

	public static int numberOfPeople = 10;//等车的学生数
	
	public static boolean isGone = false;//车开的标志
	
	public static int carWaitTime = 8;//车等的时间
	
	public static void main(String[] args) throws InterruptedException {
		
		CountDownLatch countDownLatch = new CountDownLatch(numberOfPeople);
		new Thread(new GetOn(countDownLatch)).start();
		waitStudentGetOn(countDownLatch); //等所有的学生上车
		driveHome();
	}
	
	public static void waitStudentGetOn(CountDownLatch waitStudentsGetOn) throws InterruptedException {
		 System.out.println("赶紧的,抓紧时间上车..");
		 //waitStudentsGetOn.await(carWaitTime, TimeUnit.SECONDS);//等5秒,还没上车,就开走。。
		 waitStudentsGetOn.await();// 等待所有人都上车,才走开
	}
	
	public static void driveHome() throws InterruptedException {
		System.out.println("开车,鞋儿破 帽儿破 身上的袈裟破 你笑我 他笑我 一把扇儿破");
		isGone = true;
	}
}

 

分享到:
评论
1 楼 bo_hai 2014-01-19  
new Thread(new GetOn(countDownLatch)).start(); 

可以优化成:
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(new GetOn(countDownLatch));
exec.shutdown();

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    4. **一次性使用**: 一旦计数器归0,`await()`将不再阻塞任何线程,且CountDownLatch不能重置,只能一次性使用。 **CyclicBarrier** CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达...

    CountDownLanch.rar

    CountDownLatch使用实例 - 初始化时,设置计数(count)值,也就是闭锁需要等待的线程数。 - 主线程必须在启动其他线程后立即调用 CountDownLatch.await() 方法,这样主线程的操作就会在这个方法上阻塞,直到其他...

    多线程countDownLatch方法介绍

    1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....

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

    1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...

    Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...

    countdownlatch-example-sourcecode.zip

    本文将深入探讨CountDownLatch的工作原理、使用方法以及它在并发编程中的应用场景。 1. **CountDownLatch简介** CountDownLatch是一个计数器,初始化时设置一个初始值,然后多个线程可以等待这个计数器归零。一旦...

    Java中CountDownLatch用法解析

    在`CountDownLatch`实例化时,计数器设置为这个初始值。每当调用`countDown()`方法时,计数器就会减1。当计数器的值为0时,任何因调用`await()`而阻塞的线程都将被释放并继续执行。这使得`CountDownLatch`成为一个...

    Java多线程编程之CountDownLatch同步工具使用实例

    程序创建了一个ExecutorService来管理线程池,然后创建了两个CountDownLatch实例:`cdOrder`和`cdAnswer`。`cdOrder`表示裁判发布的命令,计数器为1,意味着所有运动员必须等待裁判的命令才能开始。`cdAnswer`表示...

    Java CountDownLatch完成异步回调实例详解

    在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并探讨相关的知识点。 CountDownLatch 的工作原理 CountDownLatch 的工作原理基于计数器的概念。它维护一个计数器,初始值是指定的整数。每当一...

    CountDownLatch详解.docx

    在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。然后创建了2个等待线程,它们会在调用 `await()` 后进入等待状态。接着启动所有线程,工作线程在运行后调用 ...

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

    下面是一个使用CountDownLatch的实例,模拟了运动员比赛的场景: public class TestCountDownLatch { private static final int RUNNER_NUMBER = 5; // 运动员个数 private static final Random RANDOM = new ...

    CountDownLatch实际应用

    - 在`MergeMisRpt`方法中,创建了一个`CountDownLatch`实例,其计数值等于`vTop`,即时间跨度。 - 使用一个`for`循环创建并启动了多个线程,每个线程负责获取特定日期的数据。 - 每个线程内部,在执行完数据获取...

    java高级编程100实例

    10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...

    java线程并发countdownlatch类使用示例

    在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接完成、确保所有数据加载完毕后再开始服务等。 总结一下`CountDownLatch`的主要知识点: 1. `CountDownLatch`是...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    1. **初始化:** 使用给定的计数值创建一个 CountDownLatch 实例。 2. **递减计数器:** 在需要完成的工作完成后,调用 `countDown()` 方法来递减计数器。 3. **等待:** 其他线程调用 `await()` 方法来等待计数器的...

    140个Java源码实例

    15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...

    Java高级编程实例 100个

    本资源“Java高级编程实例 100个”提供了丰富的实践案例,旨在帮助初学者深入理解并熟练应用这些高级特性。 1. **多线程**:在Java中,多线程是并发执行任务的基本方式。学习如何创建Thread类的子类,使用Runnable...

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

    使用 CountDownLatch 需要创建一个实例并传入一个初始计数值,这个计数值表示需要等待的线程数量。然后,每个需要等待的线程在完成任务后调用 `countDown()` 方法,将计数值减一。主线程或其他需要等待的线程调用 `...

    Java编程基础、应用与实例

    Java编程基础、应用与实例是针对已有一定Java学习背景的读者设计的一套教程,旨在深化对Java编程的理解并提供实际操作的案例。本教程涵盖了Java语言的核心概念、语法特性以及在实际开发中的应用技巧。 首先,Java...

    JAVA实例精通源代码

    6. **多线程**:Java提供了丰富的多线程支持,源码中会包含Thread、Runnable接口的使用,以及同步机制如synchronized关键字、wait/notify机制和并发工具类(如Semaphore、CountDownLatch等)的实例。 7. **网络编程...

Global site tag (gtag.js) - Google Analytics