package com.jibx_maven;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
*
* <li>The first is a start signal that prevents any worker from proceeding until the driver is ready for them to proceed; </li>
*<li>The second is a completion signal that allows the driver to wait until all workers have completed. </li>
*
*/
public class CountDownLatchExample {
public static void main(String[] args) {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(4);
new Thread(new Workders(startSignal, doneSignal, "A")).start();;
new Thread(new Workders(startSignal, doneSignal, "B")).start();;
new Thread(new Workders(startSignal, doneSignal, "C")).start();
new Thread(new Workders(startSignal, doneSignal, "D")).start();;
new Thread(new Driver(startSignal, doneSignal)).start();;
}
}
class Driver implements Runnable{
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
private Random random = new Random();
public Driver(CountDownLatch startSignal, CountDownLatch doneSignal) {
super();
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
@Override
public void run() {
sendInRawMaterial();
sendOutProduct();
}
public void sendInRawMaterial()
{
System.out.println("driver is sending in some raw materials");
try {
Thread.sleep(random.nextInt(10)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("raw materials arrived");
startSignal.countDown();
}
public void sendOutProduct()
{
try {
doneSignal.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("all raw material have been made product");
System.out.println("driver is sending out the product");
}
}
class Workders implements Runnable{
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
private String workerId;
public Workders(CountDownLatch startSignal, CountDownLatch doneSignal,String workerId) {
super();
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.workerId = workerId;
}
@Override
public void run() {
try {
startSignal.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("worker "+workerId +" is to start working");
Random random = new Random();
try {
Thread.sleep(random.nextInt(20)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("worker "+workerId +" finished his work");
doneSignal.countDown();
}
}
分享到:
相关推荐
在`countdownlatch-example-sourcecode.zip`这个压缩包中,我们可以看到一些关于CountDownLatch实际应用的示例代码。本文将深入探讨CountDownLatch的工作原理、使用方法以及它在并发编程中的应用场景。 1. **...
在Java多线程编程中,`CountDownLatch`是一个非常重要的工具类,用于实现线程间的同步。这个概念在标题"threadSyncCountDownLatch:具有countDownLatch的线程同步模式"中得到了体现。`CountDownLatch`源自Java并发包`...
【Java Developer Example】是针对Java开发者的实例学习资料,它涵盖了Java编程语言的各个方面,旨在帮助初学者和有经验的开发者提升技能。"JD Exam"标签暗示了这是一系列与Java开发者考试相关的学习材料,可能包括...
HttpGet httpGet = new HttpGet("http://example.com/file.zip"); CloseableHttpResponse response = httpClient.execute(httpGet); ``` 为了实现多线程下载,我们需要将大文件分割成多个部分,每个部分对应一个...
6. **多线程**:Java提供了强大的多线程支持,源码会包含线程的创建、同步机制(如synchronized关键字、Lock接口)以及并发工具类的使用,如Semaphore、CountDownLatch等。 7. **输入/输出(I/O)**:Java的I/O流系统...
public class CountExample { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; public static int count = 0; public static void main...
public class SemaphoreExample1 { private final static int threadCount = 20; public static void main(String[] args) throws Exception { ExecutorService exec = Executors.newCachedThreadPool(); final ...
3. **java.util.concurrent 包**:这个包提供了许多高级的线程同步工具,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(倒计时器)等。这些工具可以更灵活地控制线程的并发执行。 4. **...
Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`java.util.concurrent`包中的各种高级工具,如`Semaphore`, `CyclicBarrier`, `CountDownLatch`等。 4. **死锁**...
Java并发工具类如`Semaphore`、`CyclicBarrier`或`CountDownLatch`可以帮助管理线程同步。 5. **死锁与饥饿**:在实现生产消费者模式时,要防止死锁(两个或更多线程相互等待对方释放资源)和饥饿(某个线程因资源...
在"Example062"这个示例中,可能演示了如何使用成员变量和上述的一些线程通信技术。通过分析源代码,我们可以深入理解线程通信的实际应用,包括何时创建线程,如何控制线程的执行顺序,以及如何避免线程安全问题。这...
这时,可以使用更高级的并发工具,如`PriorityBlockingQueue`、`Phaser`、`CountDownLatch`等,以满足特定的需求。 总的来说,理解和掌握生产者消费者问题及其解决策略是Java多线程编程的重要部分,这不仅有助于...
在`main/java`下,可能有`com.example.multithreadeddemo`或类似的包结构,里面会有各种多线程相关的类,如`MyThread`(继承自`Thread`)和`RunnableDemo`(实现`Runnable`接口)。每个类可能包含不同的线程示例,如...
- 使用并发工具类如`ExecutorService`、`Semaphore`、`CountDownLatch`等进行线程管理。 - 避免在循环中创建线程,可能导致性能下降。 - 对共享资源的访问需同步或使用原子操作,以避免数据竞争。 7. **其他最佳...
2. 避免过多的synchronized关键字,使用并发工具类如Semaphore、CountDownLatch。 3. 理解 volatile 关键字的含义和用法。 八、单元测试 1. 为每个类和重要的方法编写单元测试。 2. 使用JUnit或其他测试框架,确保...
Java提供了多种机制来实现线程间的同步,包括但不限于`wait`/`notify`、`CountDownLatch`、`CyclicBarrier`以及`Semaphore`等。 - **锁**: 锁机制是实现线程安全的基础。Java提供了多种锁的实现方式,如`...
- 避免过度使用线程同步,考虑使用并发工具类,如`ConcurrentHashMap`和`CountDownLatch`。 6. **集合框架** - 使用泛型约束类型,避免强制类型转换。 - 避免使用`null`作为集合元素,尤其是`Map`的键值。 - ...
6. **线程信号量**:例如`Semaphore`和`CountDownLatch`,用于控制线程的并发数量或等待其他线程完成特定操作。 7. **线程局部存储**:每个线程拥有独立的数据存储空间,避免了数据冲突。 在这个"HEALTH"程序中,...
提倡使用并发工具类,如`ConcurrentHashMap`、`CountDownLatch`等,而非手动实现线程安全。 7. **单元测试**:每个功能模块都应有相应的单元测试,确保代码的正确性。推荐使用JUnit或TestNG进行单元测试,并遵循 ...
9. **并发编程**:处理多线程时,要了解并正确使用synchronized、volatile、ThreadLocal等关键字,以及并发工具类如ExecutorService、Semaphore、CountDownLatch等。 10. **持续集成与自动化**:使用Maven或Gradle...