多线程模拟记者发布会。每个记者提一个问题,且发布会要等每个记者问题准备好,会议才能开始,待所有记者发问完后,会议结束。
下面是模拟实例:
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----
分享到:
相关推荐
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....
1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...
在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。然后创建了2个等待线程,它们会在调用 `await()` 后进入等待状态。接着启动所有线程,工作线程在运行后调用 ...
- 其他 N 个线程必须引用闭锁对象,因为它们如果完成了任务需要通过 CountDownLatch.countDown() 方法来通知CountDownLatch实例,每次调用计数减少 1。当所有 N 个线程都调用了这个方法时,计数将达到 0,主线程...
- 在主程序中创建CountDownLatch实例并初始化,如`CountDownLatch latch = new CountDownLatch(n)`,其中n表示需要完成的任务数量。 - 启动n个线程执行各自的任务,每个任务完成后调用`countDown()`方法。 - 主线...
1. **初始化:** 使用给定的计数值创建一个 CountDownLatch 实例。 2. **递减计数器:** 在需要完成的工作完成后,调用 `countDown()` 方法来递减计数器。 3. **等待:** 其他线程调用 `await()` 方法来等待计数器的...
在`Demo_CountDownLatch.java`中,可以看到创建一个CountDownLatch实例并设置初始计数值。线程执行完一个任务后会调用`countDown()`方法,计数值减一。主线程通过调用`await()`方法阻塞,直到计数值为0才继续执行。 ...
程序创建了一个ExecutorService来管理线程池,然后创建了两个CountDownLatch实例:`cdOrder`和`cdAnswer`。`cdOrder`表示裁判发布的命令,计数器为1,意味着所有运动员必须等待裁判的命令才能开始。`cdAnswer`表示...
在创建 CountDownLatch 实例时,需要传递一个 int 型的参数:count,该参数为计数器的初始值,也可以理解为该共享锁可以获取的总次数。当某个线程调用 await() 方法,程序首先判断 count 的值是否为 0,如果不会 0 ...
我们可以创建一个CountDownLatch实例,并设置计数器为1(表示需要等待一个事件)。在线程T1中调用countDown()方法,在T2和T3线程中使用await()方法来等待。 ```java CountDownLatch latch = new CountDownLatch(1...
在上述的代码示例中,创建了一个初始值为`clientTotal`的CountDownLatch实例,表示有`clientTotal`个任务需要完成。每个任务在线程池中执行完毕后,都会调用`countDown()`方法,使计数器递减。主线程则调用`await()`...
Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...
"java并发编程专题(八)----(JUC)实例讲解CountDownLatch" 本篇文章主要介绍了Java中的CountDownLatch类,作为Java并发编程专题(八)的一部分,通过实例讲解帮助读者理解和学习。下面是文章中的知识点总结: ...
Java CountDownLatch 完成异步回调实例详解 Java 中的 CountDownLatch 是一个同步辅助类,允许一个线程等待其他线程完成操作。它是一种非常有用的工具,用于在多线程环境中实现异步回调。在本文中,我们将学习如何...
在`CountDownLatch`实例化时,计数器设置为这个初始值。每当调用`countDown()`方法时,计数器就会减1。当计数器的值为0时,任何因调用`await()`而阻塞的线程都将被释放并继续执行。这使得`CountDownLatch`成为一个...
10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...
15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...
使用 CountDownLatch 需要创建一个实例并传入一个初始计数值,这个计数值表示需要等待的线程数量。然后,每个需要等待的线程在完成任务后调用 `countDown()` 方法,将计数值减一。主线程或其他需要等待的线程调用 `...
JAVA CountDownLatch(倒计时计数器)用法实例 在 Java 中,CountDownLatch 是一种同步工具,允许一个或多个线程等待其他线程完成任务。它是一种倒计时器,使用计数来控制线程的执行顺序。本文将详细介绍 ...