首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java多线程应用程序System.out.println生成延迟

Java多线程应用程序System.out.println生成延迟
EN

Stack Overflow用户
提问于 2016-11-18 01:46:34
回答 1查看 141关注 0票数 0

我正在用Java编写一个多线程应用程序,使用log4j进行日志记录。在我的基准测试中,我发现每次输出日志时,都会产生1到2个ms的延迟。经过调查,我发现问题只出现在控制台输出中,即使我摆脱了log4j并直接使用System.out.print打印,也会发生问题。在该线程中,我使用了以下测试:

代码语言:javascript
复制
        System.out.println("===============================================================");
        long ts = java.lang.System.currentTimeMillis();
        String toPrint = "### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        System.out.print(toPrint);
        System.out.println("===============================================================");

        System.out.println("### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("===============================================================");

产出如下:

代码语言:javascript
复制
===============================================================
### TEST 1 0 ms
### TEST 2 0 ms
### TEST 3 0 ms
### TEST 4 0 ms
===============================================================
### TEST 1 7 ms
### TEST 2 9 ms
### TEST 3 10 ms
### TEST 4 11 ms
=============================================================== 

多线程应用程序直接输出到控制台而不创建延迟的正确方式是什么?

我们可以设置log4j来直接做到这一点吗?

提前谢谢你的帮助..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 02:15:07

为了看到结果,我不得不将代码更改为nanos。在Eclipse中运行,我得到了~120,000 ns的最终编号。在Windows提示符中运行,我可以在一个明确的提示符上获得~700,000 ns (就在cls命令之后),但是当它必须滚动时,~2,000,000 ns

写入控制台是同步的,必须等待滚动和打印完成,所以不要登录到控制台,或者只记录极小的输出。

您在评论中说,您正在登录到文件和控制台。这在开发中是很好的,但是不会在生产中登录到控制台。你为什么要这样?无论如何,生产代码应该是无人值守的,没有人在监视控制台,那么为什么要浪费时间在那里进行日志记录呢?

如果您暂时需要查看生产日志的动态,请在日志文件上使用tail。有关Windows,请参见"Looking for a windows equivalent of the unix tail command“。

如果您坚持要登录到控制台,请尝试使用AsyncAppender

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档