首先调用哪个类run()方法?为什么?

时间:2017-03-21 05:22:50

标签: java multithreading

我使用线程概念尝试了以下代码。在这段代码中,我在两个不同的类中声明了两个run方法。我从我的main方法中调用了这些方法。  其实我想知道的是,首先调用哪个run()方法? 当我一次又一次地跑步时,我得到了相同代码的不同输出。

我的代码:

class parent
{
    public synchronized void display1()
    {
        System.out.println("Dispaly_1 is invoked");
    }
    public synchronized void display2()
    {
        System.out.println("Dispaly_2 is invoked");
    }
}
class abc extends Thread{
    parent p;
    public abc(parent p){
        this.p = p;
    }

    public void run(){
        System.out.println("abc start...");     
        p.display1();
    }
}
class xyz extends Thread{
    parent p;
    public xyz(parent p){
        this.p = p;
    }

    public void run(){
        System.out.println("xyz start...");     
        p.display2();
    }
}

public class ThreadExample {

    public static void main(String[] args) {

        parent p=new parent();
        abc ob=new abc(p);
        xyz ob1=new xyz(p);
        ob.start();
        ob1.start();

    }

}

输出: 第一次

abc start...
xyz start...
Dispaly_2 is invoked
Dispaly_1 is invoked

第二次

xyz start...
Dispaly_2 is invoked
abc start...
Dispaly_1 is invoked

第3次

abc start...
Dispaly_1 is invoked
xyz start...
Dispaly_2 is invoked

我对此输出感到困惑,任何人都可以解释这个代码的结果。 你的帮助会很感激。 感谢

2 个答案:

答案 0 :(得分:5)

  

首先调用哪个类run()方法?

要么。

  

为什么?

这是不确定的。直到线程调度程序。

如果您想要顺序执行,请不要使用线程。

答案 1 :(得分:1)

一切都取决于调度程序,调度程序可以独立管理一个线程。如果先启动abc线程,xyz可能先由调度程序执行,反之亦然。

首先启动的线程不会一直执行。

希望我的回答能够清楚地说明调度程序。