2016-07-07 40 views
-1

我有以下代碼:主線程如何在此線程之前運行?

public class Derived implements Runnable { 
     private int num; 

     public synchronized void setA(int num) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
      } 
      System.out.println("Setting value " + Thread.currentThread().getName()); 
      this.num = num; 
     } 

    @Override 
    public void run() 
    { 
     System.out.println("In run: " + Thread.currentThread().getName()); 
     setA(20); 
    } 

     public static void main(String[] args) { 
      Derived obj = new Derived(); 
      Thread t1 = new Thread(obj); 
      t1.start(); 
      obj.setA(32); 
     } 
    } 

此打印:

In run: Thread-0 
Setting value main 
Setting value Thread-0 

我的問題是,如果我開始線程「T1」第一,它進入了run方法的輸出顯示,如何如果對象被t1鎖定,主線程能夠在't1'之前調用setA嗎? (或者甚至在鎖定'obj'main之前能夠獲得鎖定)它只是調度程序還是我認爲它錯了?

+1

除非您採取明確的步驟來同步它們,否則沒有關於使用線程排序的保證。這就是整個線程的重點,它們是異步的。 –

+1

調用此代碼時,主線程已啓動並正在運行。你的另一個線程只需要一點時間來構建和運行,所以我對你看到的結果並不感到驚訝。再加上@JimGarrison上面陳述的。 –

+0

你的代碼也不應該編譯 - 你的Runnable沒有'run()'方法。 –

回答

3

如果對象被t1鎖定,主線程如何在't1'之前調用setA?

使用多個線程的重點是允許每個線程中的代碼獨立運行。 Thread.start()(或任何方法)不是即時的。這需要時間,當你的線程開始時,你可以在當前線程中運行代碼,實際上它可以在你的後臺線程開始之前運行完成。

難道僅僅是調度

這是它的一部分。但是這也是事實,即啓動一個線程不是免費的,並且需要花費很少的時間。

public class Test { 
    public static void main(String[] args) { 
     long start = System.nanoTime(); 
     new Thread(() -> System.out.println("Thread took " + 
       (System.nanoTime() - start)/1e6 + " ms to start")) 
       .start(); 
    } 
} 

我有一個快速的機器,但是當我運行這個程序來啓動第一個線程需要一段時間。

Thread took 44.695419 ms to start 
+0

謝謝你的答案@ Peter.Great的解釋。我正在嘗試的是,當一個線程進入一個同步方法時,即使讓線程休眠,其他線程也不能輸入任何對象的同步方法。我對嗎?另一個線程是否可以輸入一個正在訪問類數據的非同步? – Kode

+1

@Vwin正確的關於同步和睡眠,注意:如果你等待(),而另一個線程可以獲得鎖。如果沒有同步,任何數量的線程都可以運行一個方法。 –

+0

太好了。感謝您的幫助 – Kode

相關問題