当Java程序调用System.out.println()或Scala程序调用println()时,线程会阻塞吗?
我正在编写一个包含大量子任务的 Scala 程序。每个子任务都在 Future 内执行。建议 actor 和 future 内部的代码不要阻塞,这样后续任务也不必等待。但我非常想在控制台上打印。
如果是阻塞操作:我可以做什么来优化性能?
- 我是否应该使用专用线程进行控制台输出,以便该线程是唯一阻塞的线程?
- 还有其他建议吗?
当然,我可以尝试减少输出量,或者在 StringBuilder 中收集一些输出并批量打印,这样可以减少输出操作的数量。
当Java程序调用System.out.println()或Scala程序调用println()时,线程会阻塞吗?
是和不是。System.out
is a PrintStream
这是一个同步类。所以多个线程写入大量数据System.out
肯定会互相阻挡。然而,一旦线程获得锁,IO 是否会阻塞该线程取决于体系结构。如果写入大量 IO 超出了底层硬件的容量,那么写入will堵塞。此外,进行大量小写入(与缓冲相反)也会减慢线程速度。
我是否应该使用专用线程进行控制台输出,以便该线程是唯一阻塞的线程?
好主意,是的。然后这个线程可以通过一个单一的BufferedWriter
或某种 log4j 或其他日志记录包,与System.out
。你需要使用类似的东西BlockingQueue
对同步消息进行排队,但 IO 永远不会阻塞该队列,除非您生成消息的速度比 IO 通道可以持久保存它们的速度快。
当然,我可以尝试减少输出量,或者在 StringBuilder 中收集一些输出并批量打印,这样可以减少输出操作的数量。
The BufferedWriter
我们会为您处理这件事。
还有其他建议吗?
- 如前所述,使用更好的日志记录包或单线程编写器。
- 将日志写入具有更多 IO 带宽的不同物理磁盘。
- 切换到内存文件系统或硬件以增加 IO 带宽。固态硬盘++。
- 通过网络将其发送到另一个盒子以执行实际的持久关闭盒子。
- Use a
GzipOutputStream
动态压缩它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)