如何解读和解释这个java线程程序的执行结果
How to interpret and explain the execution result of this java threading program
我是线程的新手。我读了一篇来自 https://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/definition.html
的文章
"A thread is a single sequential flow of control within a program."对我来说还是摸不着头脑,如果有人能再举个例子再解释一下会很有帮助
然后我用下面的代码检查了一些例子。
class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
# sleep((int)(Math.random() * 1000));
/* I have changed Math.random() to 0.5 so that all will sleep with same amount of time */
sleep((int)(0.5 * 1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
class ThreeThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
new SimpleThread("Bora Bora").start();
}
}
在ThreeThreadsTest的main函数中,三个线程一个一个创建,结果应该是这样的:
0 个牙买加
0 斐济
0 波拉波拉岛
1 牙买加
1 斐济
1 波拉波拉岛
2 牙买加
2 斐济
2 波拉波拉岛 ...
但结果是这样的:
0 牙买加
0 波拉波拉岛
0 斐济
1 牙买加
1 波拉波拉岛
1 斐济
2 牙买加
2 斐济
2 波拉波拉岛
3 牙买加
3 斐济
3 波拉波拉岛
4 波拉波拉岛
4 牙买加
4 斐济
5 波拉波拉岛
5 牙买加
5 斐济
6 波拉波拉岛
6 牙买加
6 斐济
7 波拉波拉岛
7 斐济
7 牙买加
8 波拉波拉岛
8 牙买加
8 斐济
9 波拉波拉岛
9 斐济
9 牙买加
完毕!斐济
完毕!波拉波拉岛
完毕!牙买加
谁能解释为什么会这样?
Thread.start()
将线程放入准备执行的线程队列中。然后 OS 选择任何就绪线程并执行它。无法保证下一个将选择哪个线程,因此执行顺序相当随机。
里面的线程有一个"sequential flow",但对于多个线程则不然。
"the same amount of time" 并不像看起来那么固定。
在 CPU 内,一毫秒的时间就像是永恒。 CPU 将等待您定义的毫秒数,但在 "wait" 之后取决于 cpu,它将首先恢复哪个线程。
我是线程的新手。我读了一篇来自 https://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/definition.html
的文章"A thread is a single sequential flow of control within a program."对我来说还是摸不着头脑,如果有人能再举个例子再解释一下会很有帮助
然后我用下面的代码检查了一些例子。
class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
# sleep((int)(Math.random() * 1000));
/* I have changed Math.random() to 0.5 so that all will sleep with same amount of time */
sleep((int)(0.5 * 1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
class ThreeThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
new SimpleThread("Bora Bora").start();
}
}
在ThreeThreadsTest的main函数中,三个线程一个一个创建,结果应该是这样的:
0 个牙买加
0 斐济
0 波拉波拉岛
1 牙买加
1 斐济
1 波拉波拉岛
2 牙买加
2 斐济
2 波拉波拉岛 ...
但结果是这样的:
0 牙买加
0 波拉波拉岛
0 斐济
1 牙买加
1 波拉波拉岛
1 斐济
2 牙买加
2 斐济
2 波拉波拉岛
3 牙买加
3 斐济
3 波拉波拉岛
4 波拉波拉岛
4 牙买加
4 斐济
5 波拉波拉岛
5 牙买加
5 斐济
6 波拉波拉岛
6 牙买加
6 斐济
7 波拉波拉岛
7 斐济
7 牙买加
8 波拉波拉岛
8 牙买加
8 斐济
9 波拉波拉岛
9 斐济
9 牙买加
完毕!斐济
完毕!波拉波拉岛
完毕!牙买加
谁能解释为什么会这样?
Thread.start()
将线程放入准备执行的线程队列中。然后 OS 选择任何就绪线程并执行它。无法保证下一个将选择哪个线程,因此执行顺序相当随机。
里面的线程有一个"sequential flow",但对于多个线程则不然。
"the same amount of time" 并不像看起来那么固定。 在 CPU 内,一毫秒的时间就像是永恒。 CPU 将等待您定义的毫秒数,但在 "wait" 之后取决于 cpu,它将首先恢复哪个线程。