`

CountDownLatch 实例

阅读更多
   多线程模拟记者发布会。每个记者提一个问题,且发布会要等每个记者问题准备好,会议才能开始,待所有记者发问完后,会议结束。
   下面是模拟实例:
package cn.com.ld.study.thread;

/**   
 * @filename: Reporter   
 * @description: 记者  
 * @author lida  
 * @date 2013-3-29 下午1:35:01      
 */
public class Reporter {
	private String name;
	private String question;

	Reporter(String name, String question) {
		this.name = name;
		this.question = question;
	}

	public void ask() {
		System.out.println(name + "的问题是:" + this.question);
	}

	public String getName() {
		return name;
	}

}




package cn.com.ld.study.thread;

import java.util.concurrent.CountDownLatch;

/**   
 * @filename: AskJob   
 * @description: 提问线程 
 * @author lida  
 * @date 2013-3-29 下午1:34:42      
 */
public class AskJob extends Thread {
	private Reporter reporter;
	private CountDownLatch startMetting;
	private CountDownLatch endMetting;

	AskJob(Reporter reporter, CountDownLatch startMetting,
			CountDownLatch endMetting) {
		this.reporter = reporter;
		this.startMetting = startMetting;
		this.endMetting = endMetting;
	}

	public void run() {
		try {
			sleep(2000);
			startMetting.await();
			reporter.ask();
			endMetting.countDown();

		} catch (InterruptedException e) {
			e.printStackTrace();
			Thread.currentThread().interrupt();
		}
	}
}



package cn.com.ld.study.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**   
 * @filename: ReporterMetting   
 * @description: 会议现场
 * @author lida  
 * @date 2013-3-29 下午1:35:20      
 */
public class ReporterMetting extends Thread {

	private int reporeterNo;
	private CountDownLatch startMetting;
	private CountDownLatch endMetting;
	private List<Reporter> repList;

	ReporterMetting(int reporeterNo, List<Reporter> repList,
			CountDownLatch start) {
		this.reporeterNo = repList.size();
		this.repList = repList;
		this.startMetting = start;
		this.endMetting = new CountDownLatch(reporeterNo);
	}

	public void run() {
		System.out.println("-----Metting is start----");
		AskJob aj = null;
		for (int i = 0; i < this.reporeterNo; i++) {
			Reporter reporter = repList.get(i);
			aj = new AskJob(reporter, startMetting, endMetting);
			aj.start();
		}
		// 待所有的问题准备就绪后,会议真正的开始
		startMetting.countDown();
		try {
			// 等待askjob 全部执行完毕唤醒 结束会议通知
			endMetting.await();
			System.out.println("-----Metting is end----");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		List<Reporter> repList = new ArrayList<Reporter>();
		int reporeterNo = 10;
		Reporter reporter;
		for (int i = 1; i <= reporeterNo; i++) {
			reporter = new Reporter("狗仔" + i + "号", "开了" + i + "几瓶茅台,够不够喝?");
			repList.add(reporter);
		}
		CountDownLatch startMetting = new CountDownLatch(1);
		ReporterMetting rm = new ReporterMetting(reporeterNo, repList,
				startMetting);
		rm.start();

	}

}




测试结果:
-----Metting is start----
狗仔2号的问题是:开了2几瓶茅台,够不够喝?
狗仔5号的问题是:开了5几瓶茅台,够不够喝?
狗仔6号的问题是:开了6几瓶茅台,够不够喝?
狗仔3号的问题是:开了3几瓶茅台,够不够喝?
狗仔8号的问题是:开了8几瓶茅台,够不够喝?
狗仔4号的问题是:开了4几瓶茅台,够不够喝?
狗仔1号的问题是:开了1几瓶茅台,够不够喝?
狗仔7号的问题是:开了7几瓶茅台,够不够喝?
狗仔10号的问题是:开了10几瓶茅台,够不够喝?
狗仔9号的问题是:开了9几瓶茅台,够不够喝?
-----Metting is end----
分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    多线程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. 线程执行数据插入操作...

    CountDownLatch详解.docx

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

    CountDownLanch.rar

    - 其他 N 个线程必须引用闭锁对象,因为它们如果完成了任务需要通过 CountDownLatch.countDown() 方法来通知CountDownLatch实例,每次调用计数减少 1。当所有 N 个线程都调用了这个方法时,计数将达到 0,主线程...

    countdownlatch-example-sourcecode.zip

    - 在主程序中创建CountDownLatch实例并初始化,如`CountDownLatch latch = new CountDownLatch(n)`,其中n表示需要完成的任务数量。 - 启动n个线程执行各自的任务,每个任务完成后调用`countDown()`方法。 - 主线...

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

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

    Java并发工具类示例

    在`Demo_CountDownLatch.java`中,可以看到创建一个CountDownLatch实例并设置初始计数值。线程执行完一个任务后会调用`countDown()`方法,计数值减一。主线程通过调用`await()`方法阻塞,直到计数值为0才继续执行。 ...

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

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

    java并发之并发工具类

    在创建 CountDownLatch 实例时,需要传递一个 int 型的参数:count,该参数为计数器的初始值,也可以理解为该共享锁可以获取的总次数。当某个线程调用 await() 方法,程序首先判断 count 的值是否为 0,如果不会 0 ...

    Java多线程问题

    我们可以创建一个CountDownLatch实例,并设置计数器为1(表示需要等待一个事件)。在线程T1中调用countDown()方法,在T2和T3线程中使用await()方法来等待。 ```java CountDownLatch latch = new CountDownLatch(1...

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

    在上述的代码示例中,创建了一个初始值为`clientTotal`的CountDownLatch实例,表示有`clientTotal`个任务需要完成。每个任务在线程池中执行完毕后,都会调用`countDown()`方法,使计数器递减。主线程则调用`await()`...

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

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

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

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

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

    Java CountDownLatch 完成异步回调实例详解 Java 中的 CountDownLatch 是一个同步辅助类,允许一个线程等待其他线程完成操作。它是一种非常有用的工具,用于在多线程环境中实现异步回调。在本文中,我们将学习如何...

    Java中CountDownLatch用法解析

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

    java高级编程100实例

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

    140个Java源码实例

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

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

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

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

    JAVA CountDownLatch(倒计时计数器)用法实例 在 Java 中,CountDownLatch 是一种同步工具,允许一个或多个线程等待其他线程完成任务。它是一种倒计时器,使用计数来控制线程的执行顺序。本文将详细介绍 ...

Global site tag (gtag.js) - Google Analytics