gpt4 book ai didi

java - 如何在 Java 中同步输出和出错

转载 作者:行者123 更新时间:2023-12-02 06:33:50 25 4
gpt4 key购买 nike

在下面的代码中,如何按照我们期望的顺序将数字打印机设置为黑色和红色,如下所示:

  • 1(黑色)
    1(红色)
    2(黑色)
    2(红色)

与它实际执行的操作相反(一些随机顺序取决于错误或输出流是否可用):

  • 1(黑色)
    2(黑色)
    1(红色)
    2(红色)

代码:

    package threads;

public class CThread implements Runnable

{

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
outt(i);
err(i);
}

}

synchronized public void outt(int i){
System.out.println(i);
}
synchronized public void err(int i){
System.err.println(i);
}

public static void main(String [] org){
Thread th = new Thread(new CThread());
th.start();
}


}

最佳答案

即使您尝试同步 Streams 的写入(在这种情况下为 System.outSystem.err),它也不会阻止正在运行的程序观看这些流(在您的例子中为 Eclipse)就是按顺序读取这些流。

这之间有很多基础设施(包括可以按照它想要的顺序对这些 IO 操作进行排序的操作系统)。

对于现实世界的应用程序,此类问题的答案是使用日志框架。使用这些,您可以将所有级别的所有消息写入同一个文件(通常在单独的线程中,按照记录的顺序)。

如果您不想使用日志框架并希望依赖 System.out/System.err,那么您无法可靠地控制此输出的方式被第三方应用程序读取。您唯一能做的就是通过使用公共(public)锁对象同步(和刷新)IO 操作来同步这些流的写入。但请注意,这种技术对于任何多线程代码来说都是一个严重的瓶颈。

关于java - 如何在 Java 中同步输出和出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850572/

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