我有一个线程对象-ThreadB,它添加数字1-100。我创建了2个实例-b&c。

启动2个线程(不同的实例)并运行它。

结果:

    Waiting for b to complete...
    Total is: 4950
    Waiting for c to complete...


为什么我的第二个实例未完成...

Java代码:

public class ThreadA {
    public static void main(String[] args){
        ThreadB b = new ThreadB();
        ThreadB c = new ThreadB();
        b.start();
        c.start();

        synchronized(b){
            try{
                System.out.println("Waiting for b to complete...");
                b.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

            System.out.println("Total is: " + b.total);
        }

        synchronized(c){
            try{
                System.out.println("Waiting for c to complete...");
                c.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

            System.out.println("Total is: " + c.total);
        }
    }
}

class ThreadB extends Thread{
    int total;
    @Override
    public void run(){
        synchronized(this){
            for(int i=0; i<100 ; i++){
                total += i;
            }
            notify();
        }
    }
}

最佳答案

因为当您在第一个ThreadB上同步的块中时,第二个ThreadB完成了。然后,您等待第二个ThreadB,但是notify()已经发生,因此您将在那里永远等待。

请注意,这不能保证,您的程序有时可能会运行。

在ThreadB类中放入一些打印语句以测试该理论。

关于java - 运行线程对象的多个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22177774/

10-11 20:53