当 Java 程序调用 System.out.println() 或 Scala 程序调用 println() 时,线程会阻塞吗?
是和不是。 System.out
是PrintStream
一个同步类。因此,写入大量数据的多个线程System.out
肯定会相互阻塞。然而,一旦线程获得锁,IO 是否会阻塞线程取决于架构。如果您写入大量 IO,超出了底层硬件的容量,则写入将阻塞。此外,进行大量小写入(而不是缓冲的)也会减慢线程。
我应该为控制台输出使用专用线程,以便该线程是唯一阻塞的线程吗?
好主意,是的。然后这个线程可以通过单个BufferedWriter
或某种 log4j 或其他日志包写入,与System.out
. 您将需要使用类似 a 的东西将BlockingQueue
同步的消息排队,但 IO 永远不会阻塞此队列,除非您生成消息的速度快于 IO 通道可以持久保存它们的速度。
当然我可以尝试减少输出的数量,或者在一个StringBuilder中收集一些输出,然后批量打印出来,这样可以减少输出操作的次数。
我们BufferedWriter
会为您解决这个问题。
还有其他建议吗?
- 如前所述,使用更好的日志记录包或单线程编写器。
- 将日志写入具有更多 IO 带宽的不同物理磁盘。
- 切换到内存文件系统或硬件以增加 IO 带宽。固态硬盘++。
- 通过网络将其发送到另一个盒子以执行实际的持久关闭盒子。
- 使用 a
GzipOutputStream
即时压缩它。