控制台输出是阻塞操作吗?

2023-11-25

当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(使用前将#替换为@)

控制台输出是阻塞操作吗? 的相关文章

随机推荐

  • 异常过滤器在 Web api 中不起作用

    我有一个自定义异常过滤器 能够处理控制器中的所有错误 只是一个常见的错误处理机制 public class ExceptionHandlingAttribute ExceptionFilterAttribute public overrid
  • 如何在Tomcat上安装和使用CDI?

    我正在创建我的第一个项目 Java EE 7 但遇到了麻烦 感谢任何帮助 雄猫7 0 34 JSF 2 2 Primefaces 3 5 javaee api 7 0 jar 当应用程序启动时 Tomcat 日志显示以下消息 validat
  • 回调函数触发得太早

    我在 jQuery 中有这个简单的函数 function detailspage page if page checkcurrent checkcurrent page div details children div slideUp sl
  • 如何打印列表中的类型

    所以我得到了一个列表 我必须打印列表中每个项目的类型 我可以清楚地看到有字符串和整数 但我需要它在 Python 中打印出来 我们刚刚了解到for 循环所以我觉得这就是他们正在寻找的东西 但我无法将其打印出来 ls type item fo
  • 在使用 ZEIT Now 部署的 Next.js 应用程序中使用绝对导入

    在 Next js 9 教程中建议的方法导入共享组件是通过相对路径 比如 import Header from components Header 我想使用绝对导入 例如 import Header from components Head
  • listview 与 arraylist,android 中的简单适配器

    我尝试使用 arraylist 和简单适配器在列表视图中显示一些内容 我尝试了类似下面的操作 但结果显示了数组列表的姓氏 我有什么错我无法理解 final ListView listView ListView findViewById R
  • 查找正在运行的进程的 PID 并存储为数组

    我正在尝试编写一个 bash 脚本来查找正在运行的进程的 PID 然后发出终止命令 我已经部分工作了 但我面临的问题是可能有多个进程正在运行 我想向找到的每个 PID 发出终止命令 我想我需要将每个 PID 放入一个数组中 但我不知道如何做
  • C# + SQL Server ExecuteScalar() 不返回最后插入的 id

    我有以下函数 它执行查询并在成功时返回 true 在失败时返回 false 不 我想扩展该方法 以便在触发每个插入查询时 类 varinsertId包含最后插入的行的 ID 问题是insertId总是 0 所以不知何故executeScal
  • jQuery - 动态div高度等于整个窗口的高度

    我正在使用这里找到的代码jQuery 动态div高度 现在 当您调整窗口大小时 高度更改可以正常工作 但是如果向下滚动 高度不会改变 这意味着窗口属性不包含超出浏览器窗口大小的内容 因此 如果向下滚动 高度不会增加 那么我可以添加什么 那就
  • powershell运行java进程问题

    我正在尝试在 Windows XP 中通过 Powershell 运行 java 进程 这是命令 java exe cp common jar Dcontext atest1 Dresourcepath DW Install 所以 类路径是
  • 如何实现水平滚动选项卡?

    我正在尝试实现这个应用程序 目前我已经在上面设计了选项卡 由于我有超过 7 个选项卡 所以看起来太拥挤了 我该如何设计才能使 tabwidget 可以水平滚动 我在市场上的一些应用程序上看到过这种设计 但不知道如何在我的应用程序中实现它 我
  • gfortran 中的 ieee_arithmetic 内在模块

    我需要使用 gfortran 编译一个依赖于的库ieee arithmetic 但是发现gfortran无法识别这个模块 例如用代码a f90 program test use intrinsic ieee arithmetic real
  • 如何在单页应用程序中处理非根 URL?

    我尝试使用 Rails 3 2 和 Backbone js 以及 pushState 选项制作一个单页应用程序 但遇到了一些我不理解的问题 如果我加载应用程序的根 URL 一切都会正常 Rails 返回一个带有 JS 的 HTML 布局 它
  • 在批处理脚本中获取特定路径的父目录

    您好 我在批处理文件的变量中有完整的文件路径 如何获取其一级 二级父目录路径 set path C SecondParent FirstParent testfile ini 不使用变量PATH为了这 PATH 是命令提示符使用的内置变量
  • Facebook iOS SDK - 在 Graph API v2.4 中获取好友列表

    我正在使用下面的代码来获取使用应用程序的 Facebook 好友 Issue a Facebook Graph API request to get your user s friend list FBSDKGraphRequest req
  • 仅当 iOS11 可用时才包含类的扩展

    我正在尝试扩展一个用 Obj C 编写的类 并包含一个用 Swift 编写的扩展 使其符合UIDropInteractionDelegate 像这样 available iOS 11 0 extension NoteEditViewCont
  • Pandas groupby 并计算百分比变化

    我参考如何为 groupby DataFrame 创建滚动百分比 import pandas as pd data product a 1 31 2014 53 product b 1 31 2014 44 product c 1 31 2
  • 从 shell 禁用 DeviceAdmin?

    我正在尝试从 shell 卸载应用程序 但是该应用程序正在以设备管理员身份运行 因此shell gt adb uninstall com example test不工作 如何从 shell 禁用设备管理员 通常 通过设备管理员屏幕撤销管理访
  • 使用 jQuery 将表单数据转换为 JavaScript 对象

    如何将表单的所有元素转换为 JavaScript 对象 我希望有某种方法可以从我的表单自动构建 JavaScript 对象 而不必循环每个元素 我不想要一个字符串 如返回的 formid serialize 我也不希望返回的地图 formi
  • 控制台输出是阻塞操作吗?

    当Java程序调用System out println 或Scala程序调用println 时 线程会阻塞吗 我正在编写一个包含大量子任务的 Scala 程序 每个子任务都在 Future 内执行 建议 actor 和 future 内部的