Java多线程详记(四)——wait,nitify用法(生产者消费者问题)

wait()、notify()是Object提供的两个非常重要的方法,也就是说所有的对象都可已使用这两个方法,那么这两个方法怎么使用呢,其能够解决的消费者生产者问题又是在什么样的应用场景下呢?
在代码中,当在一个实例对象调用wait方法,那么当前线程就会从执行状态转变成等待状态,同时释放在实例对象上的锁,直到其它线程在刚才那个实例对象上调用notify方法并且释放实例对象上的锁,那么刚才那个当前线程才会再次获取实例对象锁并且继续执行。这样我们通过object对象就可以让多线程之间进行有效通信
读了上面一段话,你是否能够想象出这两个方法到底应该应用在什么场景下呢?

由于我们需要用同一对象唤醒、等待,所以一般来说,我们会将这两个方法应用在多线程调用、执行的“资源”里面,这样使用this关键字等待、唤醒会方便的多。

wait()、notify()能够解决生产者消费者的“顺序执行问题”(生产者生产后,消费者才能拿去消费),那么怎么样避免生产者、消费者,同时使用同一资源的问题呢(我生产者还没生产出来,你就拿去消费,肯定不现实的嘛),者就需要使用上一篇讲到的sychronized关键字用法了,把资源锁住,我搞完了你再去消费、生产。
代码实现:

class Resource{  //生产者和消费者都要操作的资源  
   private String name;  
   private int count=1;  
   private boolean flag=false;  
   public synchronized void set(String name){  
       if(flag) {
    	   try{
    		   wait();
    	   }catch(Exception e){}
       }             
       this.name=name+"---"+count++;  
       System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);  
       flag=true;  
       this.notify();  
   }  
   public synchronized void out(){  
       if(!flag) {
    	   try{
    		   wait();
    	   }catch(Exception e){};
       }         
       System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name);  
       flag=false;  
       this.notify();  
   }  
}  
class Producer implements Runnable{  
   private Resource res;  
   Producer(Resource res){  
       this.res=res;  
   }  
   public void run(){  
       while(true){ 
    	   try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
           res.set("商品");  
       }  
   }  
}  
class Consumer implements Runnable{  
   private Resource res;  
   Consumer(Resource res){  
       this.res=res;  
   }  
   public void run(){  
       while(true){  
    	   try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
           res.out();  
       }  
   }  
}  
public class ThreadCommunicate{  
   public static void main(String[] args){  
       Resource r=new Resource();  
       Producer pro=new Producer(r);  
       Consumer con=new Consumer(r);  
       Thread t1=new Thread(pro);  
       Thread t2=new Thread(con);  
       t1.start();  
       t2.start();  
   }  
}

在这里插入图片描述
运行结果正常,生产者生产一个商品,紧接着消费者消费一个商品。


wait和sleep的区别

1、sleep是线程中的方法,但是wait是Object中的方法。

2、sleep方法不会释放锁,但是wait会释放,而且会加入到等待队列中。

3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。

4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。

记得点赞加关注哦!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值