1、实现一个生产者
public class Producer implements Runnable {
SyncStack stack; //数据存放位置,和生产者是相同的位置
public Producer(SyncStack s){
stack = s;
}
public void run(){
for(int i=0; i<20; i++){
char c =(char)(Math.random()*26+'A');
stack.push(c);//产品生产后,存放产品
System.out.println("produced:"+c);
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e){
}
}
}
}
2、实现消费者
public class Consumer implements Runnable {
SyncStack stack; //数据存放位置,和生产者是相同的位置
public Consumer(SyncStack s){
stack = s;
}
public void run(){
for(int i=0;i<60;i++){
char c = stack.pop();//往外拿产品,进行产品消费
System.out.println("消费:"+c);
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e){
}
}
}
}
3、实现存放位置的线程同步
public class SyncStack {
private int index = 0;
private char []data = new char[6];
public synchronized void push(char c){
while(index == data.length){
try{
this.wait();
//某线程执行到这里时,篮子已经满了,那么就等待消费者消费。此时锁已经不再属于该线程
}catch(InterruptedException e){}
}
this.notifyAll();//唤醒其他线程(消费者线程或者其他生产者线程)
//主要是为了让消费者消费,才能唤醒其他等待的生产者线程
data[index] = c;
index++;
}
public synchronized char pop(){
while(index ==0){
try{
this.wait();
//某线程执行到这里时,篮子已经空了,那么就等待生产者生产,此时锁已经不属于该线程
}catch(InterruptedException e){}
}
this.notifyAll();//唤醒其他线程(生产者线程或者其他消费这线程)
//主要是为了让生产者生产,才能唤醒其它等待的消费者线程
index--;
return data[index];
}
}
5、测试类
public class ProducerConsumer {
public static void main(String args[]){
SyncStack stack = new SyncStack();//共享存储空间
Producer p=new Producer(stack);
Consumer c = new Consumer(stack);
new Thread(p).start();//生产者线程
new Thread(p).start();//生产者线程
new Thread(p).start();//生产者线程
new Thread(c).start();//消费者线程
}
}
分享到:
相关推荐
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
通过互斥量、事件来解决生产者和消费者的问题,主要涉及的内容有多线程的创建,事件的创建,互斥量的创建,线程的同步。主要的函数有:CreateThread,CreateEvent,CreateMutex,WaitForMultipleObjects等。
线程同步_生产者消费者问题 经典实现 线程同步_生产者消费者问题
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...
操作系统 用多线程同步方法解决生产者-消费者问题 课设报告
1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...
实验目的:使用多线程并发程序设计模拟生产者消费者问题,了解P-V操作的实现方法,实现生产者和消费者的同步和互斥,了解各线程如何使用临界资源和临界区。 主要内容:约束条件:生产者进程负责生产产品放到缓冲区,...
Java小程序:解决线程同步--生产者消费者问题,直观简单,容易理解,希望对初学者有帮助。
线程同步中的典型事例生产者消费者问题 方便理解线程的各方面内容
用多线程同步方法解决生产者-消费者问题(操作系统课设
1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有26个存储单元,放入取出的产品设定为26个大写英文字母。 3、设计要求: 1) 生产者与消费者均有二个...
生产者线程和消费者线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费...
假设存在两类进程:生产者,消费者。它们共享n个缓冲区。 生产者行为:生产产品(每次生产1个),并将产品放入空缓冲区,循环 往复,永不停息; 消费者行为:将产品从缓冲区中取出,进行消费(每次消费1个),循环 往复...
1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均...
基本满足操作系统课上要求,java实现的生产者消费者模型。
课程完整报告 实现哲学家就餐问题 1)熟悉Ubuntu系统环境和...生产者和消费者之间必须保持同步原则:不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地...