gpt4 book ai didi

java - System.out.println/System.err.println 不工作

转载 作者:行者123 更新时间:2023-11-30 02:13:31 24 4
gpt4 key购买 nike

我有以下代码:

  @Test
public void testMultipleUpdatesSameTime() {
final CyclicBarrier gate = new CyclicBarrier(3);

PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(
"C:\\pathToFile\\test2_output.txt"));
} catch (FileNotFoundException e1) {
System.err.println(e1);
}
System.setErr(out);

new Thread(() -> {
try {
gate.await();
} catch (InterruptedException e) {
System.err.println(e);
} catch (BrokenBarrierException e) {
System.err.println(e);
}
System.err.println("FROM1: Starting at: " + System.currentTimeMillis());
System.err.println("FROM1: Thread with ID: " + Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println(e);
}
System.err.println("FROM1: Ending at: " + System.currentTimeMillis());
}).start();

new Thread(() -> {
try {
gate.await();
} catch (InterruptedException e) {
System.err.println(e);
} catch (BrokenBarrierException e) {
System.err.println(e);
}
System.err.println("FROM2: Starting at: " + System.currentTimeMillis());
System.err.println("FROM2: Thread with ID: " + Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println(e);
}
System.err.println("FROM2: Ending at: " + System.currentTimeMillis());
}).start();

System.err.println("NOTHING YET");

try {
Thread.sleep(10000);
gate.await();
} catch (InterruptedException e) {
System.err.println(e);
} catch (BrokenBarrierException e) {
System.err.println(e);
}

System.err.println("DONE");
}

结果文件仅包含预期输出的一半:

  • 还没有
  • 完成
  • FROM1:起始位置:1521464569722
  • FROM2:起始位置:1521464569722
  • FROM1:ID 为 11 的线程
  • FROM2:ID 为 12 的线程

您知道为什么该文件不包含“结束于”也不包含异常吗?

最佳答案

如果写入后不关闭文件,文件会丢失某些内容,这是很常见的情况。许多 OutputStream 子类中都有 finalizer() 方法可以关闭流,但它们并不总是有机会像这里的情况那样被调用。

主线程释放门并立即退出,其他线程快速运行其进程,此时虚拟机关闭,您不能相信事情正确完成。

原始代码很复杂,很难从头开始“修复”损坏的东西。例如,在实际代码中,不会有 2 个线程竞争写入同一个文件。这完全没有道理。

在任何情况下,最好的“修复”是让主线程等待其他线程完成(而不是 hibernate ),然后关闭文件,如下所示。

Thread t1 = new Thread(() -> ...
Thread t2 = new Thread(() -> ...
t1.start();
t2.start();

t1.join();
t2.join();
out.close();

关于java - System.out.println/System.err.println 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49363812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com