作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中,如何按照我们期望的顺序将数字打印机设置为黑色和红色,如下所示:
与它实际执行的操作相反(一些随机顺序取决于错误或输出流是否可用):
代码:
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.out
和 System.err
),它也不会阻止正在运行的程序观看这些流(在您的例子中为 Eclipse)就是按顺序读取这些流。
这之间有很多基础设施(包括可以按照它想要的顺序对这些 IO 操作进行排序的操作系统)。
对于现实世界的应用程序,此类问题的答案是使用日志框架。使用这些,您可以将所有级别的所有消息写入同一个文件(通常在单独的线程中,按照记录的顺序)。
如果您不想使用日志框架并希望依赖 System.out
/System.err
,那么您无法可靠地控制此输出的方式被第三方应用程序读取。您唯一能做的就是通过使用公共(public)锁对象同步(和刷新)IO 操作来同步这些流的写入。但请注意,这种技术对于任何多线程代码来说都是一个严重的瓶颈。
关于java - 如何在 Java 中同步输出和出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850572/
我是一名优秀的程序员,十分优秀!