有人可以解释这个代码,它与线程相关

问题描述:

我无法理解控件是如何从“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

如何控制从 “EXPL主题” 输出语句传送到 “主线程” 输出语句。

控制不被传递。相反,每个线程呼叫

Thread.sleep(100); 

而且,因为这是相同的时间量,他们轮流。将其中一个更改为sleep(50),您将看到一个打印消息的速度是其两倍。

没有控制权转移......线程每100毫秒独立地向控制台打印。由于时代是相同的,所以看起来他们“轮流”,但是“先走”并不是确定性的。

更改Thread.sleep(100);值之一,您将看到一个将花费更长/更短的时间打印。

这是线程调度程序决定的事情。当你启动线程时,它将与已经存在的其他线程并行运行。它由线程调度器决定分配给每个线程的顺序和时间。

无法保证执行顺序