用一个数据来表示数据存储空间
package com.yan.test;
public class SyncStack {
private int index = 0;
private char[] stack = new char[6];
public synchronized void push(char temp) {
if (index == stack.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
stack[index] = temp;
index++;
System.out.println(Thread.currentThread().getName() + " push " + temp);
}
public synchronized char pop() {
if (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
System.out.println("___" + Thread.currentThread().getName() + " ---pop " + stack[index]);
return stack[index];
}
}
生产者
package com.yan.test;
public class Produce implements Runnable {
private SyncStack stack;
int i = 0;
public Produce(SyncStack stack) {
super();
this.stack = stack;
}
public void run() {
while (true) {
synchronized (this) {
if (i < 28) {
stack.push((char) ((char) i + 'A'));
i++;
} else {
break;
}
}
}
}
}
消费者
package com.yan.test;
public class Consumer implements Runnable {
private SyncStack stack;
int i = 0;
public Consumer(SyncStack stack) {
super();
this.stack = stack;
}
public void run() {
while (true) {
synchronized (this) {
if (i < 28) {
stack.pop();
i++;
} else {
break;
}
}
}
}
}
测试的main方法
package com.yan.test;
public class TestSysn {
public static void main(String[] args) {
SyncStack s = new SyncStack();
Produce p = new Produce(s);
Consumer c = new Consumer(s);
Thread t1 = new Thread(p);
t1.setName("product1");
Thread t3 = new Thread(p);
t3.setName("product2");
Thread t5 = new Thread(p);
t5.setName("product3");
t3.start();
t1.start();
t5.start();
Thread t2 = new Thread(c);
t2.setName("Consumer1");
Thread t4 = new Thread(c);
t4.setName("Consumer2");
t2.start();
t4.start();
}
}
结果
product2 push A
product1 push B
product2 push C
product1 push D
product2 push E
product1 push F
___Consumer1 ---pop F
product2 push G
___Consumer1 ---pop G
___Consumer1 ---pop E
___Consumer1 ---pop D
___Consumer1 ---pop C
___Consumer1 ---pop B
___Consumer1 ---pop A
product1 push H
___Consumer1 ---pop H
product3 push I
___Consumer1 ---pop I
product2 push J
___Consumer1 ---pop J
product1 push K
___Consumer1 ---pop K
product3 push L
___Consumer1 ---pop L
product2 push M
___Consumer1 ---pop M
product1 push N
___Consumer2 ---pop N
product3 push O
___Consumer1 ---pop O
product2 push P
___Consumer2 ---pop P
product1 push Q
___Consumer1 ---pop Q
product3 push R
___Consumer2 ---pop R
product2 push S
___Consumer1 ---pop S
product1 push T
___Consumer2 ---pop T
product3 push U
___Consumer1 ---pop U
product2 push V
___Consumer2 ---pop V
product1 push W
___Consumer1 ---pop W
product3 push X
___Consumer2 ---pop X
product2 push Y
___Consumer1 ---pop Y
product1 push Z
product3 push [
___Consumer2 ---pop [
product2 push \
___Consumer1 ---pop \
___Consumer2 ---pop Z
分享到:
相关推荐
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...
java多线程学习,生产者消费者问题示例
基本满足操作系统课上要求,java实现的生产者消费者模型。
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。
生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...