多线程之生产者与消费者问题
来源:互联网 发布:乐昌网络问政平台 编辑:程序博客网 时间:2024/05/17 01:12
考虑这样一个饭店,他有一个厨师和一个服务生,然后服务生必须等待厨师准备好食物,当厨师准备好食物时,他会通知服务生,然后服务生上菜,
然后返回继续等待。
/** * 食物 */class Meal{ private final int orderNum; public Meal(int orderNum){ this.orderNum=orderNum; } public String toString(){ return "Meal "+orderNum; }}/** * 服务生 */class WaitPerson implements Runnable{ private Restaurant restaurant; public WaitPerson(Restaurant r){ restaurant=r; } @Override public void run() { try { while (!Thread.interrupted()){ synchronized (this){ while (restaurant.meal==null) wait(); } System.out.println("Waitperson got "+restaurant.meal); synchronized (restaurant.chef){ restaurant.meal=null; restaurant.chef.notifyAll(); } } } catch (InterruptedException e) { System.out.println("WaitPerson interrupted"); } }}/** * 厨师 */class Chef implements Runnable{ private Restaurant restaurant; private int count=0; public Chef(Restaurant r){ restaurant=r; } @Override public void run() { try { while(!Thread.interrupted()){ synchronized (this){ while (restaurant.meal!=null) wait(); } if(++count==10){ System.out.println("Out of food.closing"); restaurant.exec.shutdownNow(); } System.out.println("Order up!"); synchronized (restaurant.waitPerson){ restaurant.meal=new Meal(count); restaurant.waitPerson.notifyAll(); } TimeUnit.MILLISECONDS.sleep(100); } } catch (InterruptedException e) { System.out.println("Chef interrupted"); } }}public class Restaurant { Meal meal; ExecutorService exec= Executors.newCachedThreadPool(); WaitPerson waitPerson=new WaitPerson(this); Chef chef=new Chef(this); public Restaurant(){ exec.execute(chef); exec.execute(waitPerson); } public static void main(String[] args){ new Restaurant(); }}通过判断餐厅中的食物是否为空来控制两个线程是否等待和执行。
效果:
Order up!
Waitperson got Meal 1
Order up!
Waitperson got Meal 2
Order up!
Waitperson got Meal 3
Order up!
Waitperson got Meal 4
Order up!
Waitperson got Meal 5
Order up!
Waitperson got Meal 6
Order up!
Waitperson got Meal 7
Order up!
Waitperson got Meal 8
Order up!
Waitperson got Meal 9
Out of food.closing
Order up!
WaitPerson interrupted
Chef interrupted
阅读全文
0 0
- 多线程之生产者与消费者问题
- 多线程之生产者与消费者问题
- 多线程之生产者与消费者问题
- 多线程-生产者与消费者问题
- 多线程之生产者消费者问题
- 多线程之生产者消费者问题
- 多线程之生产者消费者问题
- 多线程之生产者消费者问题
- java多线程之生产者与消费者问题的简单模拟
- java多线程之生产者与消费者问题的简单模拟
- JAVA多线程实例(生产者与消费者问题)
- 多线程生产者与消费者问题的总结
- java多线程同步:生产者与消费者问题
- 多线程经典问题-生产者与消费者
- Java多线程--生产者与消费者问题
- Boost多线程实现生产者与消费者问题
- 多线程解决生产者与消费者问题
- Java经典多线程问题--生产者与消费者
- Windows映射局域网共享地址至本地(Net Use)
- React Redux
- 大话数据结构(六)——队列的两种java实现方式
- 棋盘游戏 【二分匹配+枚举】
- POJ 3660 Cow Contest (全源最短路)
- 多线程之生产者与消费者问题
- 论文格式
- 门户:计算机科学
- 总结篇-Hibernate和JPA关系
- TCP--telnet为何在127s后返回?
- android studio下的aidl通信
- Java
- Monkeys in the Emei Mountain UVA
- 11.重载示例(下)