考虑一个场景:一个饭店有一个厨师和一个服务员。菜做好之后,厨师通知服务员端菜,服务员端完菜之后厨师才能做菜。
代码如下:
public class Meal {
private final int orderNum;
public Meal(int orderNum) {
// TODO Auto-generated constructor stub
this.orderNum=orderNum;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Meal "+orderNum;
}
}
===================厨师类
public class Chef implements Runnable{
private Restaurant restaurant;
private int count=0;
public Chef(Restaurant r) {
// TODO Auto-generated constructor stub
this.restaurant=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal!=null){
wait();
}
if(++count==100){
System.out.println("Out of food ");
restaurant.exec.shutdownNow();
}
System.out.println("Order up!");
//++restaurant.num;
//if(restaurant.num>1){
//System.out.println("========>>>"+count);
//}
synchronized (restaurant.waitPerson) {
restaurant.meal=new Meal(count);
restaurant.waitPerson.notifyAll();
}
//TimeUnit.MILLISECONDS.sleep(100);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Chef interrupted!");
}
}
}
====================服务员类
public class WaitPerson implements Runnable{
private Restaurant restaurant;
public WaitPerson(Restaurant r) {
// TODO Auto-generated constructor stub
this.restaurant=r;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal==null)
wait();
}
System.out.println("WaitPerson got "+restaurant.meal);
//--restaurant.num;
synchronized(restaurant.chef){
restaurant.meal=null;
restaurant.chef.notifyAll();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Wait Person interrupted.");
}
}
}
======================饭店类
public class Restaurant {
// int num=0;
Meal meal;
ExecutorService exec=Executors.newCachedThreadPool();
WaitPerson waitPerson=new WaitPerson(this);
Chef chef=new Chef(this);
public Restaurant() {
// TODO Auto-generated constructor stub
exec.execute(chef);
exec.execute(waitPerson);
}
public static void main(String[] args){
new Restaurant();
}
}
分享到:
相关推荐
C++版,生产者消费者问题利用 多线程来解决,解决消费者与生产者同步、互斥问题,
生产者消费者实现代码,简单的java实现的多生产者,多消费者代码。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
自制的简易的生产者与消费者的模拟程序.也是操作系统的一个实验题目.主要是控制进度条来实现的.
一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更...为了使本系统以更加简单、直观的形式把“消费者-生产者”问题表现出来,我选择了使 用可视化界面编程。
而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的...
当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。就是生产者和消费者之间的同步。 每次写入和读出数据时,都将读和写指针加一。当读写...
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
任务队列多线程任务队列的一个超级简单的生产者-消费者实现。您可以使用它,因为: 寻找一个轻量级且易于集成的多线程任务队列。 你没有 c++11 支持。 你想要跨平台。得到它git clone --recurse-submodules ...
Java小程序:解决线程同步--生产者消费者问题,直观简单,容易理解,希望对初学者有帮助。
os2操作系统内核实验的生产者消费者的实验报告
用C-Free5软件写的,主函数为Int类型。在其他软件上可能要改成void,算法方面没有什么问题。如果要缓冲池满就把生产者M1的数改的比消费者M2的高,要缓冲池空则相反。
主要介绍了Java实现简易生产者消费者模型过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
利用Java多线程实现的操作系统的生产者与消费者算法,主要用到了线程的同步,等待与唤醒操作。
操作系统课程生产者消费者问题模拟程序,程序相对简单,通过这个模拟程序能够帮助学习者会更好的学习os,供有需要的人学习使用。
生产者消费者实验的一个简单例子,使用的是Windows多线程的同步互斥机制。
c++简单的生产者与消费者算法,操作系统作业
利用标准C++简单实现的生产者与消费者的程序,简单模拟了生产产品和消费产品,希望对有需要的大家能够有一点点帮助.........
自己用Java写的简单生产者与消费者模型