`

线程—代码模拟—生产者-消费者

阅读更多
尚学堂—马士兵-java系列网上免费视频教程

知识点:
1.Thread.sleep();
2.Runnable接口
3.Object.wait()
4.Object.notify();
5.if 和 While 的区别
6.synchronized 关键字

ProducerConsumer.java

1.其实,编译后会生成5个class文件。但只需运行 ProducerConsumer.class即可。
2.如果想在你的console中显示中文,请将.java文件的编码设为GB2312

/**
 * 【生产者与消费者】
 * 
 * 注意:
 * 1、在使用wait()时,wait()最好写在while中。不要写在if else中。
 * 2、wait()语句只能使用在synchronized语句中,用于使synchronize释放对其内部对象的锁定。
 * 3、只要使用了wait(),在while外面一定要用notify();用于通知其它线程可以执行了。
 *
 */

public class ProducerConsumer {
	public static void main(String[] args){
		SyncStack ss = new SyncStack();
		Producer p = new Producer(ss);
		Consumer c = new Consumer(ss);
		new Thread(p).start();
		new Thread(c).start();
	}
}

class Wotou {
	int id;
	Wotou(int id){
		this.id = id;
	}
	@Override
	public String toString(){
		return "Wotou: " + id;
	}
}

class SyncStack{
	int index = 0;
	Wotou[] arrWt = new Wotou[6];
	
	public synchronized void push(Wotou wt){
		while(index == arrWt.length){
			try{
				this.wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		this.notify();
		arrWt[index] = wt;
		index ++;
	}
	public synchronized Wotou pop(){
		while(index == 0){
			try{
				this.wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		this.notify();
		index --;
		return arrWt[index];
		
	}
}

class Producer implements Runnable{
	SyncStack ss = null;
	Producer(SyncStack ss){
		this.ss = ss;
	}
	public void run(){
		for(int i=0;i<20;i++){
			Wotou wt = new Wotou(i);
			ss.push(wt);
			System.out.println("生产了:"+ wt);
			try{
				Thread.sleep(500);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable{
	SyncStack ss = null;
	Consumer(SyncStack ss){
		this.ss = ss;
	}
	public void run(){
		for(int i=0;i<20;i++){
			Wotou wt = ss.pop();
			System.out.println("消费了:"+wt);
			try{
				Thread.sleep(500);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}










--
分享到:
评论

相关推荐

    编程模拟实现生产者-消费者进程

    - **理解进程同步**:通过编程模拟生产者-消费者进程,深入理解进程之间的同步与互斥机制。 - **分析资源竞争现象**:观察并分析当多个进程尝试访问同一资源时可能出现的竞争情况,学习如何有效地解决这些问题。 ##...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均...

    用多线程同步方法解决生产者-消费者问题

    - 使用线程来模拟生产者和消费者的行为,每个线程代表一个实体,可以独立执行任务。 - 通过互斥锁保证在同一时刻只有一个线程能访问缓冲区,防止数据冲突。 - 利用信号量来控制缓冲区的满和空状态,当缓冲区满时...

    操作系统生产者——消费者模拟程序

    "P_C_Dll"可能是生产者-消费者问题的动态链接库(DLL)文件,这个库文件可能封装了生产者和消费者线程的逻辑。而"P_C"可能是包含生产者和消费者线程的源代码文件夹。 在编程实现时,需要注意以下几点: 1. **同步...

    “生产者-消费者”问题模拟系统实验报告+代码

    在这个实验报告中,学生通过编写`producers-consumers.c`源代码,实现了生产者-消费者问题的模拟。这个C程序可能使用了如互斥锁(Mutex)、信号量(Semaphore)等机制来实现线程间的同步。互斥锁用于确保任何时候...

    Java多线程 生产者-消费者模式

    Java多线程中的生产者-消费者模式是一种典型的同步与协作模型,它用于解决在多线程环境下资源的有效利用和协调问题。在这个模式中,通常有两个角色:生产者和消费者。生产者负责创建产品,而消费者则负责消费这些...

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000环境下运行的控制台应用程序,通过多线程模拟生产者和消费者的行为。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型中,...

    多进程同步解决生产者消费者问题(c++源码)

    ### 多进程同步解决生产者消费者问题(C++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...

    生产者-消费者问题.cpp

    一组生产者进程生产产品给一组消费者进程消费。一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许...

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    操纵系统课程设计生产者-消费者

    操作系统课程设计中的“生产者-消费者”模型是一个经典的多线程同步问题,它模拟了实际生产环境中的资源分配与消耗过程。在这个模型中,“生产者”代表产生数据的实体,而“消费者”则是处理这些数据的实体。在Linux...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    生产者消费者问题C#

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...

    pandc.rar_生产控制系统_生产者与消费者_生产者-消费者问题

    在这个“pandc.rar”压缩包中,包含的可能是某个开发者自编的生产者-消费者模型的源代码或实验报告,用于模拟实际的生产环境。 生产者-消费者问题的基本情景是这样的:一个系统中有两个角色,即生产者和消费者。...

    (Linux C)利用多进程或多线程模拟实现生产者/消费者问题

    以下是对"Linux C"环境下,利用多进程或多线程实现生产者/消费者问题的详细解释: 首先,我们需要了解基础概念: 1. **多进程**:在Linux系统中,每个进程都有自己的独立内存空间,它们之间的通信通常通过文件、...

    利用单线程完成的生产者与消费者程序

    通常,这种情况下会使用循环、条件变量或者状态标志等方法来模拟生产者和消费者的交替执行。例如,生产者在生成数据后会设置一个状态标志,然后切换到消费者状态;消费者在消费完数据后会改变状态标志,再切换回生产...

    生产者消费者问题(信号量)(linux)实现代码

    参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者...

    操作系统课程设计生产者和消费者问题源代码

    在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 P 3 2 P 4 3 C 4 1 4 P 2 5 C ...

    进程同步模拟设计--生产者和消费者问题

    例如,在`Test.java`文件中,我们可能会定义两个`Semaphore`对象,分别代表空槽和满槽,然后在生产者和消费者线程的代码中使用`acquire()`和`release()`方法来控制对缓冲区的访问。 此外,还需要注意避免死锁的发生...

Global site tag (gtag.js) - Google Analytics