您的位置:首页 > 职场人生

两道企业面试题(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  死锁 面试题 同步