线程经典案例:生产和消费者

class Info
{
private String tile;
private String content;
public String getTile() {
return tile;
}
public void setTile(String tile) {
this.tile = tile;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}


}


class Product implements Runnable
{
private Info info = null;
public Product(Info info)
{
        this.info = info;
}

public void run()
{
        for(int i=0; i<16; i++)
        {
          
         if(i%2== 0)
         {  
         
          this.info.setTile("李世春");
          try
          {
        Thread.sleep(1000);
          }
          catch(InterruptedException e)
          {
         e.printStackTrace();
          }
          this.info.setContent("Android程序员");        
         }
         else
         {
          this.info.setTile("何奇骏");
          try
          {
        Thread.sleep(1000);
          }
          catch(InterruptedException e)
          {
         e.printStackTrace();
          }
          this.info.setContent("亭南幼儿园小朋友");
         }
        }
}




}


class Customer implements Runnable
{
private Info info = null;

public Customer(Info info)
{
  this.info = info;
}

public void run()
{
 for(int x=0; x<16; x++)
 {
     try
     {
   
    Thread.sleep(300);
     }
    catch(InterruptedException e)
    {
    e.printStackTrace();
    }
     
 System.out.println("  this.info.getTile()---->"+  this.info.getTile()+"~~~~~~~" +"his.info.getContent()---->"+this.info.getContent());
  
 }
}
}




public class helloworld {

public static void main(String args[])
{
         Info info = new Info();
         
         new Thread(new Product(info)).start();
         new Thread(new Customer(info)).start();


}


}


运行结果:

  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->null
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->null
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->null
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->何奇骏~~~~~~~his.info.getContent()---->Android程序员
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友                                           数据不同步!!
  this.info.getTile()---->李世春~~~~~~~his.info.getContent()---->亭南幼儿园小朋友


结果和预期不一致!!

1)数据操作不同步!

2)数据重复取出和重复设置的


解决方法:

解决问题1) synchronized 方法

解决问题2) Object类中的wait和

public final void wait()
                throws InterruptedException
public final void notify()

public final void notifyAll()

class Info
{
private String tile;
private String content;
private boolean flag =false;
   //flag ==false 不能生产,只能取走 flag==true  可以生产,不能取走。

public synchronizedvoid setInfo(String title, String content)
{
  if(flag ==false)
  {
  try {
super.wait();

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
  else
  {   
      this.content = content;
      this.tile = title;
      this.flag =false;
      super.notify();

  }
}

public synchronizedvoid getInfo()
{
if(this.flag)
{
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
System.out.println("title:-->"+this.tile+"********" +"this.content:--->"+this.content);
this.flag=true;
super.notify();

}
}

}


运行结果:




Sleep 是Thread类的一个方法。时间一到,自动唤醒

wait是Object类的一个方法,需要Notify()唤醒


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值