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 五 4 2
1 3 五 2 4
1 3 2 五 4
答案 0 :(得分: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
答案 1 :(得分:1)
这是因为您无法控制首先生成哪个线程。这是由JVM决定的。只有“1,3,5”才会按顺序排列,因为它们是从main执行的。
这个问题可能有用: -
答案 2 :(得分:1)
因为你的主线程在某些时候击败了另外两个线程。其他时候没有。
你有三个线程;无法保证按计划以任何特定顺序运行。
答案 3 :(得分:1)
线程和异步性一般都是复杂的主题,但缺点是在你的情况下,线程需要稍微旋转,因此它们与其他打印语句交错,这取决于JVM的处理器时间类型(然后,OS)决定分配给那些线程。
我强烈建议由Brian Goetz和其他人撰写的这本书Java Concurrency in Practice,如果你想真正掌握正在发生的事情。