同一线程中的代码以异常顺序执行

5
这是一道SCJP练习题中的代码片段:
public class Threads2 implements Runnable {

    public void run() {
        System.out.println("run.");
        throw new RuntimeException("Problem");
    }

    public static void main(String[] args) {
        Thread t = new Thread(new Threads2());
        t.start();
        System.out.println("End of method.");
    }
}

这个问题在这里部分提到了。

然而,我的问题与之前的问题不同。当我在几台机器上多次运行程序时,有时会在输出中的“run”之前出现RuntimeException。对我来说这毫无意义,因为这些代码在同一个线程中执行,所以应该是相反的顺序。

有人能解释一下为什么会发生这种情况吗?


输出中RuntimeException之前的"run"听起来是正确的。 - jmj
糟糕,我的错。已编辑。 - kwkt
我猜这得视系统而定。System.out 什么时候被刷新? - Rob Audenaerde
1
JRE会将堆栈跟踪打印到STDERR(System.out写入STDOUT),因此很可能是读取/显示来自JRE的数据的任何设备存在问题,而不是任何执行顺序问题。 - McDowell
1
请参见https://dev59.com/L4Dba4cB1Zd3GeqPKvKW - Raedwald
1
请参见https://dev59.com/32DVa4cB1Zd3GeqPhur6#9468532。 - Raedwald
1个回答

1

e.printStacktrace使用的是System.err

System.out和System.err是不同的对象。它有缓冲写入器来显示到客户端窗口。

即使它按不同的顺序执行,它也会进入不同的缓冲区。

如果Err缓冲区先打印,则错误将首先出现。否则,out将首先出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接