【问题标题】:Java ThreadPoolExecutor stops working after a whileJava ThreadPoolExecutor 在一段时间后停止工作
【发布时间】:2011-10-23 12:03:40
【问题描述】:

我的 ThreadPoolExecutor 有问题。它可以在几个小时内正常工作,但有时(随机时间,有时在 2 分钟或 3 小时后)它会停止执行提交的任务并且程序会挂起。

队列已满,此时所有核心线程都处于活动状态。

我根本不知道这是从哪里来的。特别是因为它有时会工作 3 个小时,而所有核心线程一直在工作。

如果有人对我有建议,我会很高兴。

【问题讨论】:

  • 这是一个僵局。那么线程之间共享什么代码呢? redneck 调试:尝试在调试模式下运行您的应用程序并等待它锁定,连接调试器并挂起 jvm,然后您可以看到所有线程在哪一点。
  • 如果您怀疑死锁,则转储所有线程的堆栈跟踪。在 Windows 上,这是通过按 Control-Break 来完成的。查看线程已同步的内容以及它们正在等待的内容。
  • 发生在 7u45 我的一个客户身上,使用 ScheduledThreadPoolExecutor,经过几个小时的使用,原因不明。线程转储中没有任何异常;池中的所有线程都处于空闲状态。很多ScheduledFutureTasks 和times 过去都在排队。

标签: java concurrency threadpool executor


【解决方案1】:

我在执行 I/O 操作下载网页的代码时遇到了类似的问题。在某些时候,有时,在几分钟或几小时内,一个线程挂起执行一些 I/O 操作并停止工作。

如果是这种情况,请设置流产时间。

在调试器中运行您的代码,当您的应用程序停止时,查看您的线程最后执行的方法是什么。

【讨论】:

    【解决方案2】:

    采取look at the stack dump. 这将告诉您线程是否处于某种阻塞操作、等待从未发生、工作或真正死锁的条件。

    【讨论】:

      【解决方案3】:

      您可能在某处发生内存泄漏,并在几个小时后导致锁定

      【讨论】:

        【解决方案4】:

        如果您使用的是旧版本的 JVM,它可能与 http://bugs.sun.com/view_bug.do?bug_id=6822370 有关。这已在 6u18 中修复。见http://www.oracle.com/technetwork/java/javase/6u18-142093.html

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多