0
public class Test {
    private static void funct(final int i) {
        new Thread(new Runnable() {
            public void run() {System.out.println(i);}
         }).start(); 
    }
    public static void main(String[] args) {
        System.out.println(1);
        funct (2);
        System.out.println(3);
        funct (4);
        System.out.println(5);
    }
}

每次运行它时,我都会得到以下解决方案之一。为什么这样?1 3 5 4 2

1 3 5 2 4

1 3 2 5 4

4

4 回答 4

4

在此示例中,数字的打印顺序是不确定的。您唯一确定的是 1、3 和 5 将按此顺序出现。但是,在这种安排中,2 和 4 会出现在哪里还不得而知。原因是您有 3 个线程打印出以下数字系列: (1, 3, 5); (2) 和 (4)。这三个线程将由 JVM 调度,但它认为这是最好的。

多线程编程是一个复杂的话题,因为看起来你才刚刚开始深入研究它,所以我推荐 Oracle 的 Java 教程的并发部分:http: //download.oracle.com/javase/tutorial/essential/concurrency/index .html

于 2011-04-13T04:18:39.613 回答
1

这是因为您无法控制首先生成哪个线程。它由 JVM 决定。只有“1,3,5”是有序的,因为它们是从 main 执行的。

这个问题可能是相关的: -

  1. 在特定时间运行 java 线程
于 2011-04-13T04:18:30.223 回答
1

因为您的主线程有时会击败其他两个线程。其他时候没有。

你有三个线程;不能保证哪个会被安排以任何特定的顺序运行。

于 2011-04-13T04:20:40.917 回答
1

线程和异步通常是复杂的主题,但不足之处在于,在您的情况下,线程需要一些时间才能启动,因此它们与其他打印语句交错,具体取决于 JVM(以及,在反过来,操作系统)决定分配给那些线程。

如果您想真正了解正在发生的事情,我强烈建议您阅读 Brian Goetz 和其他人所著的Java Concurrency in Practice一书。

于 2011-04-13T04:20:52.820 回答