0

我已经用 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();
    }
}
4

6 回答 6

5

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

于 2013-05-13T14:08:15.183 回答
1

您正在创建 2 个并发运行的线程。执行顺序未知(因为两者具有相同的优先级)。请注意,如果PrintStream#println()未同步,则输出将类似于:

12 - - A ppOranlgee
// and so on
于 2013-05-13T14:09:23.517 回答
0

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

于 2013-05-13T14:38:33.010 回答
0

线程作为独立的执行流运行。在第一个 Orange 获得一些 CPU 时间之前,您可能会遍历多个 Apple。此外,如果您在多处理器系统上,则两者可以同时运行。

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

于 2013-05-13T14:09:47.500 回答
0

如果您希望结果以特定顺序出现,请在循环中使用一个线程。

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

您的线程非常短暂,它们在另一个线程启动之前就已经运行完毕。

顺便说一句:你的电脑可以在你眨眼的时间内执行 100,000,000 次操作,而启动一个新线程需要时间。

于 2013-05-13T14:09:46.053 回答
-1

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

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

于 2013-05-13T14:23:34.890 回答