EclipseJava在启动新线程之前自动等待线程完成
使用以下代码:
package myapp;
class Runner extends Thread {
public void run(){
for(int i = 0; i < 11; i++){
System.out.println("Hello " + i);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Class1 {
public static void main(String[] args){
Runner t1 = new Runner();
t1.start();
Runner t2 = new Runner();
t2.start();
}
}
我得到以下输出:
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
鉴于我的输出应如下所示:
Hello 0
Hello 0
Hello 1
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 4
Hello 4
Hello 5
Hello 5
Hello 6
Hello 6
Hello 7
Hello 7
Hello 8
Hello 8
Hello 9
Hello 9
Hello 10
Hello 10
怎么了?我使用的是Eclipse标准/SDK版本:开普勒版本
构建id:20130614-0229、jre7u25和jdk7u25
# 1 楼答案
如果两个线程具有相同的优先级,那么执行顺序就不能得到保证(运行相同的程序两次可能会产生不同的结果),这取决于托管的操作系统,因为它的任务是在线程之间调度CPU
# 2 楼答案
第一个输出是正确的,您期望的也是正确的。概率是百万分之一
虽然有多个线程,但您无法预测是否有机会运行任何特定线程。一旦发送到jvm(或本机程序的CPU),它将如何发送到jvm&;什么时候应该运行什么线程
第一个输出是正确的bcz,代码非常小,甚至在线程需要切换之前,它就已经完成了任务。这就是为什么输出没有被干预。也许你可以尝试更多的迭代,比如
>10000
,这样你就可以理解这个概念。或者您可以尝试运行代码多次。您将(可能)从同一代码中获得不同的输出Ps:将
sleep
作为最后一条指令,实际上没有任何效果,因为线程几乎已经结束了它的生命,而您只是让它等待死亡# 3 楼答案
这就是你的问题:
你先跑完整个循环,然后才睡觉。将sleep移动到for循环中,看看会发生什么