2015-10-16 23 views
-4

這裏我的代碼是thread.start():當我們調用哪個線程調用第一

public class Child extends Thread { 

     public void run(){ 
      synchronized (this) 
      { 
       for(int i=1;i<=5;i++) 
       { 
        System.out.println("child thread"); 
       } 
      } 
     } 
    } 




class ThreadTest{ 
    public static void main(String []a) { 
     Child child=new Child(); 
     **child.start();**  
     synchronized (child) 
     { 
      for(int i=1;i<=5;i++) 
      { 
       System.out.println("parent thread"); 
      } 
     } 
    } 
} 

它首先打印出「父線程」後,它打印的「子線程」,但我的疑問是,當我們調用start()方法有機會在主線程之前調用子線程。但它總是在「子線程」之後打印「父線程」。任何人都可以解釋嗎?

+2

發生這種情況的原因是'synchronized(child)'在'Child#run()'的'synchronized(this)'之前輸入。沒有保證。 –

+2

在這種情況下,由調度程序決定是否立即安排新創建的線程。對於其他任何結果都沒有保證,即使它是兩者的混合體。如果你想執行一個命令,你需要像'CountDownLatch'這樣的東西。 – biziclop

+0

@SashaSalauyou你的編輯評論是非常令人失望的。 – Tom

回答

0

調用child.start()時(即在start()返回之前)的某個地方會創建新線程,並且它有資格運行。從這一點開始,這是一場比賽,看看哪個線程首先會到達它的各自的synchronized(...)塊。沒有辦法知道哪一個會贏,而且沒有理由認爲每次都會是同一個贏家。


P.S .:同步Thread對象不是一個好主意。 Thread類也爲Thread實例同步用於自己的目的,並且存在將Thread對象用作鎖的風險可能會干擾Thread類對其的使用。

一個好習慣是在一個私人對象上進行同步。

class MyClass { 
    private final Object myLock = new Object(); 

    SomeType someMethod(...) { 
     synchronized(myLock) { 
      .... 
     } 
    } 
} 
相關問題