线程输出不按预期执行
这是我的程序。线程输出不按预期执行
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)(1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
class TwoThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
}
}
我得到输出
0 Jamaica
0 Fiji
1 Fiji
1 Jamaica
2 Jamaica
2 Fiji
3 Fiji
3 Jamaica
4 Fiji
4 Jamaica
5 Fiji
5 Jamaica
6 Fiji
6 Jamaica
7 Fiji
7 Jamaica
8 Jamaica
8 Fiji
9 Fiji
9 Jamaica
DONE! Fiji
DONE! Jamaica
我怀疑.. 1)线程牙买加被称为第一 要求它睡1000毫秒。 然后线程斐济被称为 它应该打印并要求进入睡眠1000毫秒。 但我得到如上所示的输出。 为什么它不交替和印刷线jamica和斐济
控制台输出不同步,因此它可能会在这种情况下,在封闭情况下的毛刺。 线程正在获取以正确顺序打印的命令,但打印本身需要不同的时间。
使主线程在启动Jamica后睡10,并且会在两个线程之间放置一段距离。
代码示例:(建立在OP代码):
class TwoThreadsTest extends Thread { // extends Thread addition
public static void main(String[] args) {
SimpleThread a = new SimpleThread("A");
SimpleThread b = new SimpleThread("B");
a.start();
try {
sleep(10); // offsets Console Output de-synchronization
} catch (InterruptedException ex) {
// shouldn't happen
}
b.start();
}
}
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)(1000)); // (int) is redundant
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
'main'中的睡眠会将'0 Jamaica'和'0 Fiji'之间的距离放在一起,但不能保证线程将交替打印。 – Guy
@guy你是对的,但保证线程交替打印的方法需要通过wait \ sleep进行复杂的修改,同步线程或使用Concurrent库。这里的问题是控制台输出的非同步特性,而不是代码。 –
这不是“控制台的性质”。这是应用程序代码。控制台输出_is_同步,这就是输出看起来不像“1 Jam2 Fiaijica”的原因。应用程序代码是_not_ synchronized,这就是为什么当两个线程竞相调用'System.out.println()'时,获胜者是不可预测的。 –
阅读关于线程优先级 – Vasco
没有guaranteee一个线程会后正好1000毫秒醒来取决于系统资源是否可用,可能需要更长的时间以及调度程序如何处理它。 – MartinS
'System.out.println()'每次调用它需要不同的时间。 – Guy