{
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()唤醒