2017-03-21 121 views
-2

我已經嘗試了使用線程概念的以下代碼,在此代碼中,我已經在兩個不同的類中聲明瞭兩個運行方法。我從我的主要方法中調用了這些方法。 其實我想知道的是,首先調用哪個run()方法? 當我一次又一次地跑步時,我得到了相同代碼的不同輸出。首先調用哪個類的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(); 

    } 

} 

輸出: 第1次

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

第二次

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

第三次

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

我對這個輸出感到困惑,任何人都可以解釋這個代碼的結果。 你的幫助將會升值。 謝謝

+9

線程異步運行,它們相互間的精確排序是不可預知的。就是那樣子。 – markspace

回答

5

哪個類的run()方法首先被調用?

要麼。

爲什麼?

這是不確定的。直到線程調度器。

如果你想順序執行,不要使用線程。

1

這一切都取決於調度程序,一個線程可以由Scheduler獨立管理。如果您先啓動abc線程,xyz可能會先被調度程序執行,反之亦然。

首先啓動的線程不會始終首先執行。

希望我的回答給調度器一些清晰。

相關問題