2016-04-22 80 views
-1

我無法理解控件是如何從「Expl Thread」輸出語句轉移到「Main Thread」輸出語句的。有人可以解釋這個代碼,它與線程相關

package com.myjava.threads; 

class MyRunnableThread implements Runnable { 
    public static int myCount = 0; 

    public MyRunnableThread() { 
    } 

    public void run() { 
     while (MyRunnableThread.myCount <= 10) { 
      try { 
       System.out.println("Expl Thread: " + (++MyRunnableThread.myCount)); 
       Thread.sleep(100); 
      } catch (InterruptedException iex) { 
       System.out.println("Exception in thread: " + iex.getMessage()); 
      } 
     } 
    } 
} 

public class RunMyThread { 
    public static void main(String a[]) { 
     System.out.println("Starting Main Thread..."); 
     MyRunnableThread mrt = new MyRunnableThread(); 
     Thread t = new Thread(mrt); 
     t.start(); 
     while (MyRunnableThread.myCount <= 10) { 
      try { 
       System.out.println("Main Thread: " + (++MyRunnableThread.myCount)); 
       Thread.sleep(100); 
      } catch (InterruptedException iex) { 
       System.out.println("Exception in main thread: " + iex.getMessage()); 
      } 
     } 
     System.out.println("End of Main Thread..."); 
    } 
} 



The output is: 

啓動主線程...

Main Thread: 1 
Expl Thread: 2 
Main Thread: 3 
Expl Thread: 4 
Main Thread: 5 
Expl Thread: 6 
Main Thread: 7 
Expl Thread: 8 
Main Thread: 9 
Expl Thread: 10 
Main Thread: 11 
End of Main Thread... 
+0

請格式化您的代碼 - 沒有任何縮進,它真的很難看。 –

+0

請注意,'++ MyRunnableThread.myCount'不是線程安全的 - 在極少數情況下,您的輸出可能不正確 – Numeron

回答

2

如何控制從 「EXPL主題」 輸出語句傳送到 「主線程」 輸出語句。

控制不被傳遞。相反,每個線程呼叫

Thread.sleep(100); 

而且,因爲這是相同的時間量,他們輪流。將其中一個更改爲sleep(50),您將看到一個打印消息的速度是其兩倍。

1

沒有控制權轉移......線程每100毫秒獨立地向控制檯打印。由於時代是相同的,所以看起來他們「輪流」,但是「先走」並不是確定性的。

更改Thread.sleep(100);值之一,您將看到一個將花費更長/更短的時間打印。

0

這是線程調度程序決定的事情。當你啓動線程時,它將與已經存在的其他線程並行運行。它由線程調度器決定分配給每個線程的順序和時間。

無法保證執行順序

相關問題