接上一回,如果4个工人在装配车轮时,工作间中没有车轮可装配,工人必须等到车轮运送到工作间合适的位置后才可以进行装配车轮的工作。所以,在Worker类中加入一把新的CountDownLatch-----tyreReadyLatch,
让这把锁告诉Worker线程,在轮胎到来之前,必须处于等待状态,假如不等待的话,这个Worker线程会跑出错误,导致的结果是这辆车装配轮胎整个任务失败。所以必须调用
tyreReadyLatch.await();
这个语句确保Worker线程在等待轮胎的到来。
BlockingQueue来模拟当前工作间中放轮胎的位置。假设能放下4个轮胎。往这个Queue中放入4个轮胎,运送轮胎的工作在main函数中完成
for (int i = 0; i < 4; i++){
tyries.offer(new Tyre(i));
Thread.sleep(500);
}
OK,4个轮胎就位后,调用下面这个语句,释放tyreReadyLatch,初始化时,tyreReadyLatch锁的计数器被设置为1,所以只需要调用一次tyreReadyCount的countDown()方法。以告诉4个Worker线程,你们可以进行轮胎的装配工作。
tyreReadyLatch.countDown();
下面的这行代码模拟Worker线程在接受到可以进行装配工作的“指令”后,从工作间里拿出一个轮胎。
Tyre tyre = tyries.take();
拿到轮胎后,Worker线程的工作模式和第一回中的工人装配轮胎一节中的行为是一样的了。
可见,使用多个CountDownLatch可以比较精确的控制一个线程的运行状态。CountDownLatch的await和countDown方法必须配合使用。否则会造成线程一直处于等待状态。
最后,完整的代码清单。
public class Worker implements Runnable {
private String name;
static CountDownLatch workDoneLatch = new CountDownLatch(4);
static CountDownLatch tyreReadyLatch = new CountDownLatch(1);
static ArrayBlockingQueue<Tyre> tyries = new ArrayBlockingQueue<Tyre>(4);
public Worker(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.format("%s is waiting for tyre ready....%n", name);
tyreReadyLatch.await();
Tyre tyre = tyries.take();
System.out.format("%s is assembling.%n", tyre);
marshalTyre();
System.out.format("%s is assembled.%n", tyre);
workDoneLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void marshalTyre() throws InterruptedException {
Thread.sleep(new Random().nextInt(60000));
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(4);
long s = System.currentTimeMillis();
String works[] = { "John Chembers", "Bill Gates", "Larry Page", "Ericsson Limited" };
for (int i = 0; i < 4; i++)
executorService.execute(new Worker(works[i]));
for (int i = 0; i < 4; i++){
tyries.offer(new Tyre(i));
Thread.sleep(500);
}
tyreReadyLatch.countDown();
workDoneLatch.await();
System.out.format("the 4 tyres were assembled. costs %d ms.%n", System.currentTimeMillis() - s);
executorService.shutdown();
}
}
辅助类Tyre,代表轮胎
class Tyre {
private int id;
public Tyre(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Tyre: " + id;
}
}
[原创内容,版权所有,如有转载,请注明出处,如有错误之处,请指出,不胜感激]
分享到:
相关推荐
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...
根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
《Java并发编程实战》是Java开发者深入理解和掌握并发编程的一本经典著作。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者在多核时代编写出高效、可伸缩且线程安全的代码。 并发编程是现代...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...