JAVA多线程生产者与消费者问题
昨天看了一下资料,模仿着写了个,怎么跑起来死锁了?望各位大牛看看哪代码有误 ?
正确的情况 应该是 ,打印 生产 一个 ,接着打印 消费一个 (假设最多只能存放一个产品)
/**
* 店员类
* 假设 店内只有一个产品架 只能存放一个产品
*
*
*/
public class Clerk {
//-1代表店内没有可用产品
private int product = -1;
//生产一个产品
public synchronized void setProduct(int product) throws InterruptedException{
if(this.product != -1){
//产品架上还有产品 等待消费者消费
wait();
}
this.product = product;
System.out.println("当前线程"+Thread.currentThread().getName()+"生产第"+product+"个产品");
//解锁 并通知其他线程进入线程等待队列排队
notify();
}
//消费一个产品
public synchronized void getProduct(int product) {
if(this.product == -1){
//没有产品 等待生产者生产
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.product = -1;
System.out.println("当前线程"+Thread.currentThread().getName()+"消费第"+product+"个产品");
//解锁 并通知其他线程进入线程等待队列排队
notify();
}
}
/**
* 生产者
*
*
*/
public class Produce implements Runnable {
private Clerk clerk;
public void run(){
for(int i=1; i<=10; i++){
if(this.clerk == null){
clerk = new Clerk();
}
System.out.println("----当前线程"+Thread.currentThread().getName()+ "开始生产");
try {
clerk.setProduct(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 消费者
*
*
*/
public class Consume implements Runnable {
private Clerk clerk;
public void run(){
for(int i=1; i<=10; i++){
if(this.clerk == null){
clerk = new Clerk();
}
System.out.println("----当前线程"+Thread.currentThread().getName()+ "开始消费");
try {
clerk.getProduct(i);
} catch (Exception e) {
e.printStackTrace();
};
}
}
}
//调用类
public class Main {
public static void main(String[] args){
Produce pro = new Produce();
Thread produceThread = new Thread(pro);
produceThread.start();
Consume con = new Consume();
Thread consumeThread = new Thread(con);
consumeThread.start();
}
}
分享到:
相关推荐
本文通过多线程方法解决了生产者与消费者之间同步的问题
java多线程实现生产者和消费者
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
使用多线程实现了生产者和消费者模式
c#多线程之生产者消费者
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
用C语言实现的多线程生产者消费者问题 可运行 包含源程序及实验报告 内含流程图 运行截图
基本满足操作系统课上要求,java实现的生产者消费者模型。
生产者消费者流程图; 生产者消费者流程图。
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
缓冲区没满:生产者可以生产 缓冲区没空:消费者可以消费 生产消费可以同时进行 生产者、消费者、产品、缓冲区的数量可以自定义
多线程实例,关于生产者与消费者的问题 多线程实例,关于生产者与消费者的问题
Qt5多线程,使用QSemaphore类实现生产者和消费者问题。
实验目的:使用多线程并发程序设计模拟生产者消费者问题,了解P-V操作的实现方法,实现生产者和消费者的同步和互斥,了解各线程如何使用临界资源和临界区。 主要内容:约束条件:生产者进程负责生产产品放到缓冲区,...