一道腾讯多线程笔试题的问题和思考

刚刚接触多线程问题和开发,一些简单,狭隘的想法还请读者指教。


原题截图不方便上传,题目大概如下;

系统中有是哪个进程,Producer,Transmitter和Consumer,P和T共用一个缓冲区ProduceBuf, T和C公用一个缓冲区ConsumeBuf。 

其流程如下图:其中ProduceBuf最多放12个信息,现已放入3个;ConsumeBuf最多放6个信息。



大概的想法使用传统生产者消费者问题的解法 用wait() notify() 解决问题代码如下:

public class AdvanceCP {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 AdvanceCP ad = new AdvanceCP();
         ProduceBuf pb = ad.new ProduceBuf();
         ConsumeBuf cb = ad.new ConsumeBuf();
         Producer p = ad.new Producer(pb);
         Transmitter t = ad.new Transmitter(pb,cb);
         Consumer c = ad.new Consumer(cb);
         Thread tp = new Thread(p);
         Thread tt = new Thread(t);
         Thread tc = new Thread(c);

            tc.start();
            tt.start();
            tp.start();
     
         
	}
	
	class ProduceBuf {
		int index = 0;
		Integer[] buffer = new Integer[12];
		
		public synchronized void produce(){
		         while(index==buffer.length){
		        	 //buffer is full
		        	try {
						this.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
		         }
		         int newInt = (int) (Math.random()*100);
		         buffer[index] = newInt;
		         System.out.println("Producing a new object."+newInt);
		         index++;
		         this.notify();
		}
		
		public synchronized Integer pop(){
			while(index==0) {
				try{
					this.wait();
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
			index--;
			System.out.println("Transmitting a new object."+buffer[index]);
			return buffer[index];
		}
	}
	
	
	class ConsumeBuf {
		int index = 0;
		Integer[] buffer = new Integer[6];
		
		public synchronized void push(Integer newint){
		         while(index==buffer.length){
		        	 //buffer is full
		        	try {
						this.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
		         }
		         buffer[index] = 0-newint;
		         System.out.println("Transmitted a new object."+buffer[index]);
		         index++;

		         this.notify();
		}
		
		public synchronized Integer pop(){
			while(index==0) {
				try{
					this.wait();
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
			index--;
			System.out.println("Consuming a new object."+buffer[index]);
			return buffer[index];
		}
	}
	
	class Producer extends Thread{
		ProduceBuf pb =null;
		Producer(ProduceBuf p){
			pb = p;
		}
		public void run(){
			while(true){
			pb.produce();
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}
	}
	
	class Transmitter extends Thread{
		ProduceBuf pb = null;
		ConsumeBuf cb = null;
		Transmitter(ProduceBuf p,ConsumeBuf c){
			pb = p;
			cb  =c;
		}
		public void run(){
			while(true){
			cb.push(pb.pop());
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}
	}
	
	class Consumer extends Thread{
		ConsumeBuf cb = null;
		Consumer(ConsumeBuf c){
			cb=c;
		}
		public void run(){
			while(true){
		    cb.pop();
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}
		
	}

}



根据三个进程sleep的时间不同,会出现死锁情况,即程序没有正常持续工作,个人觉得认为可能是Transmitter进程无法同时获得两个缓冲区的锁进行工作,正在思考解决办法,也希望有想法的可以指教。 


更新: 

注释掉sleep()方法似乎让程序跑起来更像一个多线程程序。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值