什么会使单个任务执行器停止处理任务?

2023-12-30

我正在使用一个java.util.concurrent.ExecutorService我通过调用获得的Executors.newSingleThreadExecutor(). This ExecutorService有时会停止处理任务,即使它尚未关闭并继续接受新任务而不抛出异常。最终,它建立了足够的队列,我的应用程序将关闭OutOfMemoryError例外情况。

文档似乎表明,如果有必要,这个单线程执行器应该通过启动一个新的工作线程来替换已经死亡的线程,从而避免任务处理错误。我错过了什么吗?


听起来您有两个不同的问题:

1)你的工作队列过多。你不能只是不断地将新任务塞进队列,而不考虑任务执行器的消耗率。您需要找出一些逻辑来了解何时阻止向工作队列添加新内容。

2)任务线程中任何未捕获的异常都可以完全杀死该线程。当这种情况发生时,ExecutorService 会启动一个新线程来替换它。但这并不意味着您可以忽略导致线程终止的任何问题!找到那些未捕获的异常并捕获它们!

这只是一种预感(因为您的帖子中没有足够的信息来了解其他情况),但我不认为您的问题是任务执行器停止处理任务。我的猜测是,它处理任务的速度不如您创建任务的速度。 (事实上​​,你的任务有时会过早终止,这可能与问题是正交的。)

至少,这是我使用线程池和任务执行器的经验。


好吧,根据您的评论,这是另一种听起来可行的可能性(一切都会顺利运行几个小时,直到突然停止)......

您的任务线程之间可能会出现罕见的死锁。大多数时候,你很幸运,僵局不会自行显现。但有时,两个或多个任务线程会进入等待释放另一个线程持有的锁的状态。此时,无法进行更多任务处理,并且您的工作队列将堆积起来,直到出现 OutOfMemoryError 错误。

以下是我诊断该问题的方法:

消除任务线程之间的所有共享状态。首先,这可能需要每个任务线程为其所需的所有共享数据结构制作防御性副本。一旦你这样做了,就完全不可能遇到僵局了。

此时,逐渐重新引入共享数据结构,一次一个(具有适当的同步)。每次微小修改后重新运行应用程序以测试死锁。当您再次遇到崩溃情况时,请仔细查看共享资源的访问模式并确定是否确实需要共享它。

对我来说,每当我编写使用线程池和执行器处理并行任务的代码时,我总是尝试消除ALL这些任务之间共享状态。就应用程序而言,它们也可能是完全自主的应用程序。寻找死锁是一件很麻烦的事情,根据我的经验,消除死锁的最佳方法是让每个线程拥有自己的本地状态,而不是与其他任务线程共享任何状态。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么会使单个任务执行器停止处理任务? 的相关文章

  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 用于制作代码编辑器的 JavaFX 相当于 JSyntaxPane 的什么?

    以前在 Swing 中 我使用过JSyntaxPane用于制作一个小型 Java 源代码编辑器 为了练习 我决定用 JavaFX 重做整个项目并添加对更多语言的支持 最好是尽可能多 不过好像没有什么类似的JSyntaxPane 一些研究让我
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • Spring Security 角色层次结构不适用于 Thymeleaf sec:authorize

    我正在使用 Spring Security 3 2 5 RELEASE 和 ThymeLeaf 2 1 4 RELEASE 我已经在安全上下文中定义了角色层次结构 在我的视图层中我正在使用sec authorize属性来定义菜单项 我希望看
  • 如何在 JASPIC 中保存经过身份验证的用户?

    我开发了一个安全认证模块 SAM 并实现了validateRequest方法 我还有一个简单的 Web 应用程序配置为使用此 SAM In my validateRequest方法 我检查 clientSubject 并设置一个Caller
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe

随机推荐