Java中关于线程的一个问题

*以下代码中,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();
                    }
                    }
}*
阅读 2.8k
1 个回答

短回答:注释中的代码里面在两个线程中使用了两个不同的 Warehouse 对象。在非注释代码块中使用的是同一个对象实例。

额外的建议:在你调用 Threadstart 方法的时候,你的 Runnable 对象的 run 方法就立即在这个新创建的线程中开跑了,你在调用线程(也可以称为主线程)中接下来的操作会同时执行。

你的代码中同时调用了两个线程实际上执行次序是难以预测的。如果你要它们同时开跑,需要使用 java.util.concurrent.Semaphore 来同步。

推荐问题
logo
101 新手上路
子站问答
访问
宣传栏