两道企业面试题(2)-生产者消费者问题

/*
 *   生产者消费者问题
 */
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


猜你喜欢

转载自blog.csdn.net/hpuxiaofang/article/details/53241722