Java 多线程(二)线程间的通信应用--生产者消费者(未完)

对于多个生产者和消费者。
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记。


为什么定义notifyAll,
因为需要唤醒对方线程。
因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。


启动主类

/**
 * 
 */
package threadCommnication;

/**
 * <p>Title: InputOutputDemo</p>
 * <p>Description: </p>
 * <p>Company: </p>
 * @author 夏 杰
 * @date 2015年12月12日 下午8:40:53
 * @vesion 1.0
*/
public class ConsumerProducerDemo {


	public static void main(String[] args) {
		Resource resource = new Resource();
		Producer producer = new Producer(resource);
        Consumer consumer = new Consumer(resource);
        
        //启动生产者线程
        new Thread(producer).start();

        //启动消费者线程

        new Thread(consumer).start();
	}
    
}


所要生产的资源

/**
 * 
 */
package threadCommnication;


public class Resource {
	  String name;  

	  private int count = 1;
	  /**
	   * 标志位
	   * flag = false 表示没有资源了,要生产,消费者不能取
	   * flage = ture 表示有资源,不要生产,消费者可以取
	   */
	  private boolean flag = false;
	  
	  public synchronized void  set(String name) throws InterruptedException{
		 
		  if(flag == true){
			//当已经有资源时要等待消费者取走后,才能生产  
			this.wait();  
			
		  }else {
		   //当没有资源时,继续生产
			this.name = name+"--"+count++; 
			System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
		    flag = true;
		    //当生产了后,通知等待的消费者来取
		    this.notify();
		  }
		  
	  }
	  
	  public synchronized void out() throws InterruptedException{
		  if(flag == true){
			  //当有资源时可以取走
			  System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
				flag = false;
				//通知生产者可以继续生产
				this.notify();
		  }else{
			//当没有资源时等待生产者生产
			 this.wait(); 
		  }
	  }
}


生产者

/**
 * 
 */
package threadCommnication;


public class Producer implements Runnable{
    private Resource resource;
    boolean flag = false; 
    
    //保证传入对象唯一性  
	public Producer(Resource resource) {
		this.resource = resource;
	}

	@Override
	public synchronized void run() {
		
		    while(true){ 
		    	
		    	try {
		    		
		    		resource.set("+商品+");
					
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		       
		    }  
		
	}
	
}

消费者

/**
 * 
 */
package threadCommnication;


public class Consumer  implements Runnable{
	private Resource resource;
	  public Consumer(Resource resource){  //保证传入对象唯一性  
		    this.resource = resource;  
		  }  
	  
	@Override
	public synchronized void run() {
	
		while(true)
		{
			try {
				resource.out();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值