2013-05-13 73 views
0

我已经用Java编写了这段代码,但我不明白为什么输出不是我所期望的。线程在java中如何工作?

任何人都可以解释为什么苹果和桔子混乱,他们没有一一列出?

package first_experiment; 

class Orange extends Thread{ 

    public void run(){ 
     for (int i=1 ; i<21 ; i++) 
      System.out.println(i + " - Orange"); 
    } 
} 

class Apple extends Thread{ 

    public void run(){ 
     for (int i =1 ; i <11 ; i++) 
      System.out.println(i + " - Apple"); 
    } 
} 

public class one{ 
    public static void main (String args[]){ 
     Thread O = new Orange(); 
     Thread A = new Apple(); 

     O.start(); 
     A.start(); 
    } 
} 
+1

你能解释一下你期望发生什么并发布你的输出吗? – djechlin 2013-05-13 14:11:35

回答

5

这两个线程同时运行。由JVM决定将它们打印出来的顺序,而且不能依赖可预测的顺序。

+0

Downvoter请解释。 – djechlin 2013-05-13 15:33:40

1

您正在创建2个并发运行的线程。执行顺序未知(因为两者具有相同的优先级)。请注意,如果PrintStream#println()不是那么同步输出会是这样的:

12 - - A ppOranlgee 
// and so on 
0

如果你想要的结果出现在一个特定的顺序,在循环中使用一个线程。

如果您使用多个线程,您希望它们尽可能以任意顺序启动和运行。

你的线程很短暂,他们正在运行完成,然后另一个人可以开始。

顺便说一句:你PC可以在你眨眼的时候执行100,000,000次操作,而开始一个新线程需要时间。

0

线程作为独立和独立的执行流运行。在第一个Orange获得一些CPU时间之前,您可能会循环访问多个Apples。另外,如果你在一个多处理器系统上,两者都可以一致地运行。

如果你希望他们协调他们的输出,你需要使用wait()和notify()。

+0

感谢每一个机构 – 2013-05-13 14:45:21

-1

线程可能以任意顺序启动,但结果会混乱,因为System.out.println同步线程对它的访问,因此会一个接一个地执行打印。

要查看真正的随机输出,请将数据保存在列表中,然后再打印列表中的内容。

0

java中的线程是启动时独立运行的进程,一行启动的线程代码在线程之间执行一次,没有特定的执行顺序。 上面的代码将随机显示在控制台计数 - 橙色和计数 - Apple中。