`
someoneneedsme
  • 浏览: 4838 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

CountDownLatch Example

阅读更多
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-example-sourcecode.zip`这个压缩包中,我们可以看到一些关于CountDownLatch实际应用的示例代码。本文将深入探讨CountDownLatch的工作原理、使用方法以及它在并发编程中的应用场景。 1. **...

    threadSyncCountDownLatch:具有countDownLatch的线程同步模式

    在Java多线程编程中,`CountDownLatch`是一个非常重要的工具类,用于实现线程间的同步。这个概念在标题"threadSyncCountDownLatch:具有countDownLatch的线程同步模式"中得到了体现。`CountDownLatch`源自Java并发包`...

    JD Example

    【Java Developer Example】是针对Java开发者的实例学习资料,它涵盖了Java编程语言的各个方面,旨在帮助初学者和有经验的开发者提升技能。"JD Exam"标签暗示了这是一系列与Java开发者考试相关的学习材料,可能包括...

    用HttpClient写了一个多线程下载软件

    HttpGet httpGet = new HttpGet("http://example.com/file.zip"); CloseableHttpResponse response = httpClient.execute(httpGet); ``` 为了实现多线程下载,我们需要将大文件分割成多个部分,每个部分对应一个...

    thinkinjava源码-TIJ4Example:Java4示例源代码中的思考

    6. **多线程**:Java提供了强大的多线程支持,源码会包含线程的创建、同步机制(如synchronized关键字、Lock接口)以及并发工具类的使用,如Semaphore、CountDownLatch等。 7. **输入/输出(I/O)**:Java的I/O流系统...

    你会用Java代码模拟高并发吗

    public class CountExample { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; public static int count = 0; public static void main...

    Java并发编程与高并发解决方案之并发容器(J.U.C).docx

    public class SemaphoreExample1 { private final static int threadCount = 20; public static void main(String[] args) throws Exception { ExecutorService exec = Executors.newCachedThreadPool(); final ...

    JAVA100例之实例65 JAVA线程同步

    3. **java.util.concurrent 包**:这个包提供了许多高级的线程同步工具,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(倒计时器)等。这些工具可以更灵活地控制线程的并发执行。 4. **...

    第8章 多线程.pptx

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`java.util.concurrent`包中的各种高级工具,如`Semaphore`, `CyclicBarrier`, `CountDownLatch`等。 4. **死锁**...

    Java 生产消费者模式

    Java并发工具类如`Semaphore`、`CyclicBarrier`或`CountDownLatch`可以帮助管理线程同步。 5. **死锁与饥饿**:在实现生产消费者模式时,要防止死锁(两个或更多线程相互等待对方释放资源)和饥饿(某个线程因资源...

    用成员变量进行线程通信.rar_线程通信

    在"Example062"这个示例中,可能演示了如何使用成员变量和上述的一些线程通信技术。通过分析源代码,我们可以深入理解线程通信的实际应用,包括何时创建线程,如何控制线程的执行顺序,以及如何避免线程安全问题。这...

    线程同步--生产者消费者问题

    这时,可以使用更高级的并发工具,如`PriorityBlockingQueue`、`Phaser`、`CountDownLatch`等,以满足特定的需求。 总的来说,理解和掌握生产者消费者问题及其解决策略是Java多线程编程的重要部分,这不仅有助于...

    java多线程demo

    在`main/java`下,可能有`com.example.multithreadeddemo`或类似的包结构,里面会有各种多线程相关的类,如`MyThread`(继承自`Thread`)和`RunnableDemo`(实现`Runnable`接口)。每个类可能包含不同的线程示例,如...

    Java语言编程规范-华为技术有限公司.rar

    - 使用并发工具类如`ExecutorService`、`Semaphore`、`CountDownLatch`等进行线程管理。 - 避免在循环中创建线程,可能导致性能下降。 - 对共享资源的访问需同步或使用原子操作,以避免数据竞争。 7. **其他最佳...

    java编程规范 crm

    2. 避免过多的synchronized关键字,使用并发工具类如Semaphore、CountDownLatch。 3. 理解 volatile 关键字的含义和用法。 八、单元测试 1. 为每个类和重要的方法编写单元测试。 2. 使用JUnit或其他测试框架,确保...

    java性能调优

    Java提供了多种机制来实现线程间的同步,包括但不限于`wait`/`notify`、`CountDownLatch`、`CyclicBarrier`以及`Semaphore`等。 - **锁**: 锁机制是实现线程安全的基础。Java提供了多种锁的实现方式,如`...

    阿里巴巴编码规范(Java)满分答卷

    - 避免过度使用线程同步,考虑使用并发工具类,如`ConcurrentHashMap`和`CountDownLatch`。 6. **集合框架** - 使用泛型约束类型,避免强制类型转换。 - 避免使用`null`作为集合元素,尤其是`Map`的键值。 - ...

    体检程序 HEALTH 用户界面线程 通信.rar_health_用户界面线程_界面线程

    6. **线程信号量**:例如`Semaphore`和`CountDownLatch`,用于控制线程的并发数量或等待其他线程完成特定操作。 7. **线程局部存储**:每个线程拥有独立的数据存储空间,避免了数据冲突。 在这个"HEALTH"程序中,...

    阿里巴巴开发手册泰山版最新.zip

    提倡使用并发工具类,如`ConcurrentHashMap`、`CountDownLatch`等,而非手动实现线程安全。 7. **单元测试**:每个功能模块都应有相应的单元测试,确保代码的正确性。推荐使用JUnit或TestNG进行单元测试,并遵循 ...

    Java编码规范

    9. **并发编程**:处理多线程时,要了解并正确使用synchronized、volatile、ThreadLocal等关键字,以及并发工具类如ExecutorService、Semaphore、CountDownLatch等。 10. **持续集成与自动化**:使用Maven或Gradle...

Global site tag (gtag.js) - Google Analytics