感觉还有点小问题 , 大家帮忙看看
import java.util.ArrayList;
public class Generant_Customer {
public static void main(String[] args) {
Collection c = new Collection();
Generant gen = new Generant(c);
Customer cus = new Customer(c);
new Thread(gen,"gen01").start();
new Thread(gen,"gen02").start();
new Thread(gen,"gen03").start();
new Thread(cus,"cus01").start();
new Thread(cus,"cus02").start();
}
}
/**
* 资源类 , 消费者和生产者共同操作的资源
*/
class Collection {
ArrayList<String> collection = new ArrayList<String>();
static final int length = 10;
int index = 1 ;
int operateCount = 0;
/* 生产者生产 */
public synchronized void add(){
if(collection.size()>=length){
try {
wait();
} catch (InterruptedException e) {
System.out.println("add() has been interrupted !");
System.exit(1);
}
}
notifyAll();//唤醒在此对象监视器上等待的单个线程
collection.add("馒头 编号:"+index);
System.out.println("生产者" +Thread.currentThread().getName() + collection.get(index-1));
index ++ ;
operateCount++;
}
/* 消费者消费 */
public synchronized void pop(){
if(collection.size() == 0){
try {
wait();
} catch (InterruptedException e) {
System.out.println("pop() has been interrupted !");
System.exit(1);
}
}
notifyAll(); //唤醒在此对象监视器上等待的单个线程
System.out.println("--消费者" +Thread.currentThread().getName() + collection.get(collection.size()-1));
collection.remove(collection.size()-1);
index -- ;
operateCount++;
}
}
class Generant implements Runnable{
Collection coll = null ;
public Generant(Collection collection ){
this.coll = collection ;
}
/* 生产者开始执行 */
public void run() {
while(true){
coll.add();
System.out.println(coll.operateCount);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
System.out.println("Generant.run() has been interrupted !\\n" +
" System continue...");
}
}
}
}
class Customer implements Runnable{
Collection coll = null ;
/* 线程开关 */
boolean doRun = true ;
public Customer(Collection collection ){
this.coll = collection ;
}
/* 消费者开始执行 */
public void run() {
while(doRun){
coll.pop();
System.out.println(coll.operateCount);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
System.out.println("Customer.run() has been interrupted !\\n" +
" System continue...");
}
if(coll.operateCount == 50){
doRun = false;
}
}
}
}
分享到:
相关推荐
在"生产者和消费者问题.txt"文件中,可能包含了使用`BlockingQueue`实现生产者消费者问题的Java代码示例,包括如何创建队列,以及生产者和消费者线程如何交互。而"哲学家就餐问题.txt"文件可能展示了如何用Java的...
"生产者消费者问题"和"读写者问题"是经典的并发控制问题,通过使用信号量机制可以有效地解决这些问题。下面将详细阐述这两个问题以及如何在Linux环境下用C语言实现。 首先,我们来看“生产者消费者问题”。这个问题...
生产者和消费者问题是这样的:想象有一个缓冲区,生产者线程负责生产产品并放入缓冲区,而消费者线程则负责从缓冲区取出并消费产品。问题的核心在于,当缓冲区满时,生产者必须等待消费者消费一部分产品才能继续生产...
"C语言编程模拟生产者和消费者问题" 本文档主要介绍了使用C语言编程来模拟生产者和消费者问题的解决方案。生产者和消费者问题是操作系统中的一种经典问题,它们之间的同步是通过使用PV操作来实现的。PV操作由P操作...
生产者和消费者问题是进程同步中的经典案例,它阐述了如何有效地管理和协调资源的生产与消费,以避免数据竞争和死锁等问题。 生产者和消费者问题涉及到两个主要角色:生产者和消费者。生产者负责生成数据(产品),...
实验报告的标题揭示了本次操作系统课程设计的主题——“生产者和消费者问题”,这是一个经典的问题,常见于多线程编程和并发控制的学习中。该问题旨在模拟一个系统,其中多个生产者线程生产产品,而多个消费者线程...
在计算机科学和编程领域,"多个生产者和消费者问题"是一个经典的并发控制问题,它涉及到多线程或进程之间的同步。在Windows环境下,VC(Visual C++)是常用的开发工具,可以用来解决这类问题。本篇文章将深入探讨...
在计算机科学领域,"生产者和消费者问题"是一个经典的多线程同步问题,它涉及到操作系统中的资源管理和线程协作。该问题由Dijkstra提出,旨在模拟一个系统,其中多个生产者线程创建产品,而多个消费者线程消费这些...
实验一 生产者和消费者问题 因为源码比较长,所以想在网上找现成的,不想自己写,结果找了好久,发现:第一,《操作系统实验指导》基本上找不到电子版的;第二,这个实验的源码也很难找(反正我是没找到,好不容易...
### 操作系统上机实验报告:进程同步和通信——生产者和消费者问题模拟 #### 一、实验目的 本次实验的主要目的是让学生通过调试、修改、运行一个模拟程序,加深对进程概念的理解,熟悉同步和通信的过程,掌握进程...
### 管程机制下的生产者和消费者问题 在计算机科学领域中,**生产者-消费者问题**(Producer-Consumer Problem)是操作系统中一个经典的进程同步问题,它用来描述多个进程之间的数据交换过程中的同步问题。该问题的...
生产者和消费者问题是线程同步的经典案例,常用于演示和理解这两个概念。 **互斥**是指在同一时刻,只有一个线程能访问临界区(critical section),即包含共享资源的代码段。这是通过互斥锁(mutex)来实现的。在...
本主题将深入探讨如何使用信号量这一同步工具来解决两个经典的问题:有限缓冲区的生产者-消费者问题以及读进程具有优先权的读者-写者问题。 首先,我们来看生产者-消费者问题。在这个问题中,有一个有限大小的缓冲...
6. 使用信号量可以解决生产者-消费者问题,防止生产者和消费者线程同时操作缓冲区列表。 7. 互斥信号量用于阻止生产者线程和消费者线程同时操作缓冲区列表。 8. 信号量用于同步生产者线程和消费者线程的操作。
C语言编程模拟生产者和消费者问题 本文详细介绍了使用C语言模拟生产者和消费者问题的实现方法,包括实验目的、实验环境、实验步骤等。实验目的旨在模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误...
(1)创建生产者和消费者线程 在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 ...
linux下C++实现生产者和消费者问题,并及时输出缓存区的状态,方便理解。代码中有详细的注释,方便阅读。
该课程设计的主要目的是掌握基本的同步与互斥算法,了解生产者消费者模型,以及学习使用 Windows 2000/XP 中基本的同步对象,并掌握相关 API 的使用方法。 一、实验目的 本实验的目的是掌握基本的同步与互斥算法,...
(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。 (2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、...