使用以下代码:
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 Standard / SDK版本:Kepler Release
Build id:20130614-0229,jre7u25和jdk7u25。
答案 0 :(得分:4)
这是你的问题:
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();
}
你首先贯穿整个循环然后再睡觉。将睡眠移动到 for-loop中,看看会发生什么。
答案 1 :(得分:2)
第一个输出是正确的,你期望的也是正确的。概率是百万分之一的尝试。
虽然有多个线程,但您无法确定是否有任何特定线程可以运行。一旦被发送到jvm(或本机程序的情况下的CPU),它的jvm怎么样&amp;什么时候应该运行什么线程。
1st out put是正确的bcz,代码非常小,甚至在线程需要切换之前,它已经完成了它的任务。这就是输出没有干预的原因。也许你可以尝试更大的迭代次数,比如>10000
,这样你就可以理解这个概念了。或者您可以尝试运行代码次数。您将(可能)从相同的代码获得不同的输出。
Ps:保持sleep
作为最后一条指令,实际上没有任何效果,因为线程已经完成了它的生命,而你只是让它等待死亡。
答案 2 :(得分:1)
如果2个线程具有相同的优先级,则无法保证执行的顺序(运行相同的程序两次可能产生不同的结果)并且它取决于托管的操作系统,因为它的工作是在之间调度CPU。线程。