我有以下代码。主线程启动另一个线程。 7秒后,主线程中断另一个线程。
package com.company;
public class Main {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 10; i++ )
{
System.out.println("Sleeping #" + i);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
e.printStackTrace();
continue;
}
}
}
});
t.start();
try {
Thread.sleep(7000);
t.interrupt();
} catch (InterruptedException e) {}
}
}
我希望得到这样的输出:
Sleeping #0
Sleeping #1
Interrupted
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.company.Main$1.run(Main.java:16)
at java.lang.Thread.run(Thread.java:748)
Sleeping #2
Sleeping #3
... and so on
但我得到的是:
Sleeping #0
Sleeping #1
Interrupted
Sleeping #2
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.company.Main$1.run(Main.java:16)
at java.lang.Thread.run(Thread.java:748)
Sleeping #3
... and so on
首先打印“Interrupted
”。然后是下一次迭代“Sleeping #2
”的输出,然后打印堆栈跟踪。为什么会这样?打印堆栈跟踪似乎有延迟。是IntelliJ Idea控制台相关的问题吗?因为当我在本机控制台中运行程序时,它运行良好。
答案 0 :(得分:2)
System.out.println
输出到stdout
,而Throwable.printStackTrace
输出到stderr
。终端实现可以独立地缓冲每个流,并且每个流的输出将被交错的方式没有明确定义。
如果要确保严格按顺序显示给定线程的输出,请将所有输出定向到同一个流。在您的情况下,您可以更改printlns以使用System.err
或使用Throwable.printStackTrace(System.out)