【问题标题】:System.out and .err - Back to the future? [duplicate]System.out 和 .err - 回到未来? [复制]
【发布时间】:2015-10-09 18:18:55
【问题描述】:

在我的程序的最开始,我打印出这两行:

Dyvil 1.0.0 的 Dyvil 编译器 1.0.0

从 'config.txt' 加载配置文件

第一个打印在System.err,而第二个打印在System.out。两个println 调用都发生在main 方法中按上述顺序。但是,似乎有时会交换消息:

从 'config.txt' 加载配置文件

Dyvil 1.0.0 的 Dyvil 编译器 1.0.0

在 Eclipse 调试模式或从 Gradle 构建脚本运行程序时会发生这种情况(我没有使用 java 命令对其进行测试)。请注意,绝对不涉及多线程,所以不要告诉我疯狂的定义。

这是怎么回事?

【问题讨论】:

  • 可能取决于何时刷新输出缓冲区。

标签: java multithreading console synchronization


【解决方案1】:

这两个流就是这样,两个不同流。因此,如果您最终将它们合并到某种控制台输出中,那么这些行出现乱序是完全可行的。

System.outSystem.err 都是 PrintStreams,因此几乎可以肯定是缓冲的,所以这取决于它们何时被刷新。

【讨论】:

    【解决方案2】:

    这是 Eclipse 中的一个错误 - “发送到 stdout 和 stderr 的输出排序不是确定性的”。见https://bugs.eclipse.org/bugs/show_bug.cgi?id=9720

    【讨论】:

      【解决方案3】:

      您总是可以在第二个println 之前添加sleep(#ofseconds) 命令,但在第一个println 之后添加,以确保它在第二个被打印。这将打印第一行,等待您选择的秒数,然后打印第二行。这是一种解决方法,但它可能会解决问题。

      【讨论】:

      • 使用更可靠flush().
      • sleep() 很少解决任何问题:它通常只是让问题不太可能发生。也许可能性要小很多。在我的世界里,这意味着在测试中发生的可能性要小得多。因此,如果问题确实发生,它可能会发生在客户站点。 :-O
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多