放蛋糕的桌子
public class Table {
private final String[] buffer;
private int tail; /下一个放put的地方
private int head; //下一个放的take地方
private int count; // buffer内的蛋糕数
public Table(int count) {
this.buffer = new String[count];
this.head = 0;
this.tail = 0;
this.count = 0;
}
// 放置蛋糕
public synchronized void put(String cake) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " puts " + cake);
while (count >= buffer.length) {
wait();//当蛋糕数大于容器大小是等待
}
buffer[tail] = cake;
tail = (tail + 1) % buffer.length;
count++;
notifyAll();//唤醒等待线程
}
// 取得蛋糕
public synchronized String take() throws InterruptedException {
while (count <= 0) {
wait();//当蛋糕数为0时,等待
}
String cake = buffer[head];
head = (head + 1) % buffer.length;
count--;
notifyAll();//唤醒等待线程
System.out.println(Thread.currentThread().getName() + " takes " + cake);
return cake;
}
}
吃线程
public class EaterThread extends Thread {
private final Random random;
private final Table table;
public EaterThread(String name, Table table, long seed) {
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
String cake = table.take();
Thread.sleep(random.nextInt(1000));
}
} catch (InterruptedException e) {
}
}
}
做线程
public class MakerThread extends Thread {
private final Random random;
private final Table table;
private static int id = 0; // 蛋糕的流水号(所有厨师共通)
public MakerThread(String name, Table table, long seed) {
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run() {
try {
while (true) {
Thread.sleep(random.nextInt(1000));
String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";
table.put(cake);
}
} catch (InterruptedException e) {
}
}
private static synchronized int nextId() {
return id++;
}
}
测试线程
public class Main {
public static void main(String[] args) {
Table table = new Table(3); // 建立可以放置3個蛋糕的桌子
new MakerThread("MakerThread-1", table, 31415).start();
new MakerThread("MakerThread-2", table, 92653).start();
new MakerThread("MakerThread-3", table, 58979).start();
new EaterThread("EaterThread-1", table, 32384).start();
new EaterThread("EaterThread-2", table, 62643).start();
new EaterThread("EaterThread-3", table, 38327).start();
}
}
分享到:
相关推荐
书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...
7. **生产者消费者模型(ProducerConsumer)**:这是一种经典的多线程设计模式,通过使用阻塞队列,生产者线程将数据放入队列,而消费者线程从队列中取出数据。Java并发库中的`BlockingQueue`接口是实现这一模式的...
目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...
在深入探讨Java多线程设计模式的知识点之前,让我们首先明确多线程编程在Java中的地位和作用。Java自诞生之日起就内置了对多线程编程的支持,这使得开发能够充分利用多核处理器性能的应用程序成为可能。多线程设计...
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在Java中,多线程是通过Thread类或实现Runnable接口来创建和管理的。本教程将深入探讨多线程设计模式,帮助...
在这个"Producer/Consumer 多线程处理文件"的主题中,我们将深入探讨Java中的生产者消费者模型,以及如何利用这一模式来高效地处理大量数据,如一秒钟处理一千多条记录。 生产者消费者模型源于操作系统理论,是解决...
Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。在这个“java多线程设计模式详解(PDF及源码)”的压缩包中,你将找到深入的理论讲解以及实践示例...
### 软件工程中的多线程编程实践 ...合理的多线程设计不仅可以显著提高程序的性能,还能增强程序的稳定性和响应能力。在未来的发展中,随着硬件技术的进步,多线程编程将成为更加重要的技术手段之一。
例如,生产者消费者模型(Producer-Consumer Problem)可以利用`BlockingQueue`实现线程间的通信,而模板方法模式则可以指导如何在多线程环境中定义操作的框架,允许子类定制具体步骤。此外,单例模式在多线程环境中...
Java多线程编程不仅可以显著提升程序的性能,还能让程序设计更加贴近现实世界的模型。然而,多线程编程也伴随着一系列挑战,如死锁、竞态条件等问题。因此,在实际开发中,开发者需要充分了解多线程的工作原理,并...
"典型的多线程--生产和消费"这个主题,通常指的是生产者-消费者问题,这是一种经典的设计模式,用于解决如何在一个数据结构(如队列)中高效地存储和检索数据,同时避免生产者过于快速地生成数据而消费者无法及时...
ProducerConsumer 模型是计算机科学中的一个经典设计模式,它主要解决了多线程环境下的资源同步和通信问题。在 C# 中,我们可以利用 .NET Framework 提供的并发和线程管理工具来实现这个模型。本项目 "Producer...
线程设计模式包括Master-Worker模式、Producer-Consumer模式等,这些模式定义了多线程环境下任务执行和资源分配的标准方式。Master-Worker模式中,Master线程负责分配任务,Worker线程负责执行任务;Producer-...
在多线程环境中,确保数据的一致性和程序的正确性非常重要,因此多线程模式对于处理并发问题尤为重要。 - **Guarded Suspension**:保护性暂停模式,允许线程等待条件满足后再继续执行。 - **Producer-Consumer**:...
5. **代码实现**:在`Consumer-Producer.rar`中的`Consumer-Producer`文件可能包含了具体的Java代码实现,它可能包括两个类——`Producer`和`Consumer`,分别代表生产者和消费者。每个类可能有一个无限循环来持续...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
在IT领域,多线程间通信是并发编程中的重要概念,尤其在服务器端应用和高并发系统中。本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,...
这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是有一个共享资源,即队列,在这里作为数据缓冲区。生产者线程负责将产品(数据)放入队列,而消费者...