消费者与生产者
1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import java.util.concurrent.TimeUnit; 4 5 class Meal{ 6 private final int orderNum; 7 public Meal(int orderNum){ 8 this.orderNum = orderNum; 9 } 10 public String toString(){ 11 return "Meal" + orderNum; 12 } 13 } 14 15 class WaitPerson implements Runnable{ 16 private Restaurant restaurant; 17 public WaitPerson(Restaurant r){ restaurant = r; } 18 19 @Override 20 public void run() { 21 // TODO Auto-generated method stub 22 try{ 23 while(!Thread.interrupted()){ 24 synchronized(this){ 25 while(restaurant.meal == null){ //餐馆没有菜单就等待,厨师生产出来。 26 wait(); 27 } 28 } 29 System.out.println("服务员获得菜单:" + restaurant.meal); 30 synchronized(restaurant.chef){ 31 restaurant.meal = null; 32 restaurant.chef.notifyAll(); 33 } 34 } 35 36 }catch(InterruptedException e){ 37 System.out.println("WaitPerson interrupted"); 38 } 39 } 40 41 } 42 43 class Chef implements Runnable{ 44 private Restaurant restaurant; 45 private int count = 0; 46 public Chef(Restaurant r) { restaurant = r; } 47 48 @Override 49 public void run() { 50 // TODO Auto-generated method stub 51 try{ 52 while(!Thread.interrupted()){ 53 synchronized(this){ 54 while(restaurant.meal != null){ //生产者,当饭店有菜单时,就等待服务员拿走 55 wait(); 56 } 57 } 58 if(++count == 10){ 59 System.out.println("生产的食品超量!"); 60 restaurant.exec.shutdownNow(); 61 } 62 System.out.println("Order up"); 63 synchronized(restaurant.waitPerson){ //生产餐厅的菜单,这时要保证其间服务员不会介入,然后再通知服务员取菜单 64 restaurant.meal = new Meal(count); 65 restaurant.waitPerson.notifyAll(); 66 } 67 TimeUnit.MILLISECONDS.sleep(100); 68 } 69 }catch(InterruptedException e){ 70 System.out.println("Chef interrupted"); 71 } 72 } 73 } 74 public class Restaurant { 75 Meal meal; 76 77 ExecutorService exec = Executors.newCachedThreadPool(); 78 79 WaitPerson waitPerson = new WaitPerson(this); 80 Chef chef = new Chef(this); 81 public Restaurant(){ 82 exec.execute(chef); 83 exec.execute(waitPerson); 84 85 } 86 public static void main(String[] args){ 87 new Restaurant(); 88 } 89 }
运行结果:
Order up
服务员获得菜单:Meal1
Order up
服务员获得菜单:Meal2
Order up
服务员获得菜单:Meal3
Order up
服务员获得菜单:Meal4
Order up
服务员获得菜单:Meal5
Order up
服务员获得菜单:Meal6
Order up
服务员获得菜单:Meal7
Order up
服务员获得菜单:Meal8
Order up
服务员获得菜单:Meal9
生产的食品超量!
WaitPerson interrupted
Order up
Chef interrupted
posted on 2013-10-29 16:09 ONLY LOVE PROGRAME 阅读(339) 评论(0) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 还在手写JSON调教大模型?.NET 9有新玩法
· 为大模型 MCP Code Interpreter 而生:C# Runner 开源发布
· 面试时该如何做好自我介绍呢?附带介绍样板示例!!!
· JavaScript 编年史:探索前端界巨变的幕后推手