线程同步通信

  *  为避免死锁,就应该让线程在进入阻塞状态时尽量释放其锁定的资源,以为其他的线程提供运行的机会,Object类中定义了几个有用的方法:wait()、notify()、notifyAll()。

1)  wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。

2)  notify():唤醒调用wait()方法后被阻塞的线程。每次运行该方法只能唤醒一个线程。

3)  notifyAll():唤醒所有调用wait()方法被阻塞的线程。

实例,生产者和消费者。
生产者-消费者问题是多线程同步处理的典型问题
有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。

//资源类
class Res{
 String name;
 String sex;
 boolean b;
}
//生产者
class Input implements Runnable{
 private Res r;
 public Input(Res r){
  this.r=r;
 }
 public void run() {
  int x=0;
  while(true){
   
   synchronized(r){
    if(r.b){
     try {
      r.wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   if(x==0){
    r.name="张三";
    r.sex="男";
   }else{
    r.name="lisi";
    r.sex="nv";
   }
   r.b=true;
   r.notify();
   }
   x=(x+1)%2;
  }
 }
}
//消费者
class Output implements Runnable{
 private Res r;
 public Output(Res r){
  this.r=r;
 }
 public void run() {
  while(true){
   synchronized(r){
    if(!r.b){
     try {
      r.wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   System.out.println(r.name+"---"+r.sex);
   r.b=false;
   r.notify();
   }
  }
  
 }
}

public class ThreadDemo4 {

 public static void main(String[] args) {
  Res t=new Res();
  Input d1=new Input(t);
  Output d2=new Output(t);
  Thread t1=new Thread(d1);
  Thread t2=new Thread(d2);
  t1.start();
  t2.start();

 }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值