两道企业面试题(2)-生产者消费者问题
2016-11-20 16:44
323 查看
/* * 生产者消费者问题 */ 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; } 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((int)(Math.random()*1000)); }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(); //将返回值打印出来,但看不到WoTou的id,可以重写它的toString方法 System.out.println("消费了:"+wt); try{ Thread.sleep((int)(Math.random()*1000)); }catch (InterruptedException e){ e.printStackTrace(); } } } }
运行结果:
消费了:WoTou:0
生产了:WoTou:0
生产了:WoTou:1
消费了:WoTou:1
生产了:WoTou:2
生产了:WoTou:3
消费了:WoTou:3
消费了:WoTou:2
生产了:WoTou:4
消费了:WoTou:4
生产了:WoTou:5
消费了:WoTou:5
生产了:WoTou:6
生产了:WoTou:7
消费了:WoTou:7
消费了:WoTou:6
生产了:WoTou:8
消费了:WoTou:8
生产了:WoTou:9
消费了:WoTou:9
生产了:WoTou:10
消费了:WoTou:10
生产了:WoTou:11
生产了:WoTou:12
消费了:WoTou:12
生产了:WoTou:13
消费了:WoTou:13
消费了:WoTou:11
生产了:WoTou:14
消费了:WoTou:14
生产了:WoTou:15
消费了:WoTou:15
消费了:WoTou:16
生产了:WoTou:16
生产了:WoTou:17
消费了:WoTou:17
生产了:WoTou:18
消费了:WoTou:18
生产了:WoTou:19
消费了:WoTou:19
相关文章推荐
- 线程面试题之四:生产者消费者问题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- 面试题之:生产者和消费者问题
- 面试题之:生产者和消费者问题
- 面试题:用 wait-notify 写一段代码来解决生产者-消费者问题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- 生产者消费者问题的java实现
- 生产者消费者问题的Java实现
- 应以完整产品理念指导企业营销——对有效解决消费者抱怨问题的一点建议
- 生产者-消费者问题
- 线程高级---生产者消费者问题
- 生产者-消费者问题
- 生产者与消费者问题
- 线程-生产者消费者问题
- TT和LG编程系列之线程(生产者和消费者问题)
- C#编写的多生产者多消费者同步问题
- 使用BlockingQueue来简化消费者与生产者的问题
- [原创]C#编写的多生产者多消费者同步问题
- 应以完整产品理念指导企业营销——对有效解决消费者抱怨问题的一点建议