*以下代码中,main函数中,注释部分和非注释部分有什么区别?为何注释部分的运行结果不正确,而非注释部分运行结果正确?
public class A
{
public static void main(String[] args)
{
//Thread xc1=new Thread(new Produce(new Warehouse()));
//xc1.start();
//Thread xc2=new Thread(new Sell(new Warehouse()));
//xc2.start();
Warehouse wh=new Warehouse();
Produce pd=new Produce(wh);
Sell sl=new Sell(wh);
Thread xc1=new Thread(pd);
xc1.start();
Thread xc2=new Thread(sl);
xc2.start();
}
}
class Warehouse
{
private char space[]=new char[8];
private int sku=0;
public synchronized void sellin(char x)
{
while(sku==space.length)
{
try
{
this.wait();
}
catch(Exception e){}
}
this.notify();
space[sku]=x; ++sku;
System.out.println("生产线正在生产第"+sku+"个产品,该产品是"+x);
}
public synchronized void sellout()
{
while(sku==0)
{
try
{
this.wait();
}
catch(Exception e){}
}
this.notify();
char y=space[sku-1];
--sku;
System.out.println("正在消费第"+sku+"个产品,该产品是"+y);
}
}
class Produce implements Runnable
{
private Warehouse xc=null;
Produce(Warehouse x)
{
this.xc=x;
}
public void run()
{
char y;
for(int i=0;i<26;i++)
{
y=(char)('A'+i);
xc.sellin(y);
}
}
}
class Sell implements Runnable
{
private Warehouse xc=null;
Sell(Warehouse x)
{
this.xc=x;
}
public void run()
{
for(int i=0;i<26;i++)
{
xc.sellout();
}
}
}*
短回答:注释中的代码里面在两个线程中使用了两个不同的 Warehouse 对象。在非注释代码块中使用的是同一个对象实例。
额外的建议:在你调用
Thread
的start
方法的时候,你的Runnable
对象的run
方法就立即在这个新创建的线程中开跑了,你在调用线程(也可以称为主线程)中接下来的操作会同时执行。你的代码中同时调用了两个线程实际上执行次序是难以预测的。如果你要它们同时开跑,需要使用
java.util.concurrent.Semaphore
来同步。