在下面的代码中,如何按照我们的预期将数字打印机设置为黑色和红色,如下所示:
与实际操作相反(某些随机顺序取决于错误或流出的流是否可用):
代码:
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();
}
}
答案 0 :(得分:2)
即使您尝试同步Streams的编写(在这种情况下为System.out
和System.err
),也不会阻止正在观看这些Streams的程序(在您的情况下为Eclipse)按顺序读取这些流。
它之间有很多基础设施(包括可以按照任何顺序对这些IO操作进行排序的操作系统。)
对于真实世界的应用程序,这类问题的答案是使用日志框架。有了这些,您可以将所有级别的所有消息写入同一文件(通常在单独的线程中,按照记录的顺序)。
如果您不想使用日志记录框架并希望依赖System.out
/ System.err
,则无法可靠地控制第三方应用程序如何读取此输出。您唯一能做的就是通过使用公共锁定对象同步(和刷新)IO操作来同步这些流的写入。
但请注意,这种技术是任何多线程代码的严重瓶颈。
答案 1 :(得分:0)
为输出和错误创建一个ArrayList。而不是System.out和System.err附加到该列表。然后决定何时打印它并首先打印一个空的输出列表,打印并清空错误列表。必须同步。此外:打印点火后出现的新输出和错误将不会被分类 - 当然 - 这是无法解决的,因为System.out和System.err的输出在先到先得的控制台中合并。如果你想解决这个问题,你必须等到程序结束,然后打印所有输出和所有错误。