java等待唤醒机制

 

//等待唤醒机制
/***
 等待的线程放在线程池
 
wait()、notify()、notifyall()都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。

为什么这些操作线程的方法要定义Object类中呢?
因为这些方法操作同步中的线程时,都必须要表示它们所操作线程持有的锁,
只有同一个锁上的被等待线程,可以被同一个锁上的notify()唤醒。
也就是说,等待和唤醒必须是在同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。
*/


class Info
{
   String name;
   String sex;
   boolean flag=false;
}

class Input implements Runnable
{
    private Info i;
 Input(Info i)
 {
   this.i=i;
 }
 public void run()
 {
    int x=0;
    while(true)
    {
   
       synchronized(i)
    {
         if(i.flag==true)
       try{i.wait();}catch(Exception e){}
   
         if(i.flag==false)
     {
      
             if(x==0)
            {
                 i.name="张飞";
                 i.sex="女";
             }
             else
             {
               i.name="李四";
            i.sex="男";
             }
             x=(x+1)%2;
    i.flag=true;
    i.notify();
        }
   }
  
  
  
  
    }
 }
}

class Output implements Runnable
{
   private Info i;
   Output(Info i)
   {
      this.i=i;
   }
  
   public void run()
 {
    while(true)
    {
   
       synchronized(i)
    {
         if(i.flag==false)
        try{i.wait();}catch(Exception e){}
         if(i.flag==true)
         {
                System.out.println(i.name+"........"+i.sex);
         }
      i.flag=false;
      i.notify();
    }
    }
 }
}

class 线程笔记_等待唤醒机制
{
  
   public static void main(String[] args)
   {
        Info i=new Info();
       
        Input in=new Input(i);
  Output out=new Output(i);
  
  Thread t1=new Thread(in);
  Thread t2=new Thread(out);
  t1.start();
  t2.start();
  
   }
  
  
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值