Java IntellijIdea控制台延迟

Java IntellijIdea控制台延迟,java,intellij-idea,output,Java,Intellij Idea,Output,我有以下代码。主线程启动另一个线程。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

我有以下代码。主线程启动另一个线程。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
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

它首先打印“
中断
”。然后是下一次迭代的输出“
Sleeping#2
”,然后打印堆栈跟踪。为什么会这样?打印堆栈跟踪似乎有延迟。是IntelliJ Idea控制台相关问题吗?因为当我在本机控制台中运行程序时,它运行得很好。

System.out.println
输出到
stdout
,而
Throwable.printStackTrace
输出到
stderr
。终端实现可以独立地缓冲每个流,并且每个流的输出将被交错的方式没有很好地定义


如果要确保严格按顺序显示给定线程的输出,请将所有输出定向到同一个流。在您的情况下,您可以将println更改为使用
System.err
或使用
Throwable.printStackTrace(System.out)
System.out.println
输出到
stdout
,而
Throwable.printStackTrace
输出到
stderr
。终端实现可以独立地缓冲每个流,并且每个流的输出将被交错的方式没有很好地定义


如果要确保严格按顺序显示给定线程的输出,请将所有输出定向到同一个流。在您的情况下,您可以将printlns更改为使用
System.err
或使用
Throwable.printStackTrace(System.out)

printStackTrace
输出到stderr而不是stdout。控制台并没有提供任何关于如何交错它们的保证。@pvg,那么?如果这是原因,那么为什么它在控制台中运行时效果很好?你说的“如此”是什么意思?有两条不同的溪流。一个终端或另一个终端如何选择交织它们取决于实现。如果您想获得严格的顺序输出,请输出到同一个流。@pvg,噢,谢谢。我将它
printStacktrace
输出到stderr,而不是stdout。控制台并没有提供任何关于如何交错它们的保证。@pvg,那么?如果这是原因,那么为什么它在控制台中运行时效果很好?你说的“如此”是什么意思?有两条不同的溪流。一个终端或另一个终端如何选择交织它们取决于实现。如果您想获得严格的顺序输出,请输出到同一个流。@pvg,噢,谢谢。我明白了
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