【问题标题】:How to deal with the hang threads when using the Executors.newFixedThreadPool(100)使用 Executors.newFixedThreadPool(100) 时如何处理挂起线程
【发布时间】:2016-08-30 12:49:40
【问题描述】:

假设我们通过代码ExecutorService executorService = Executors.newFixedThreadPool(100) 创建了 100 个线程,不幸的是,假设这 100 个线程全部挂起,在这种情况下,线程池中没有空闲线程可以使用,也无法处理新的请求。那么如何处理这种情况呢?强制中止挂起线程并让它返回线程池?如果是如何强制中止线程?或者如果有超时可以使用,超时后挂起线程会自动中止,并返回线程池?

【问题讨论】:

标签: java multithreading threadpool


【解决方案1】:

线程只有一个生命,这就是为什么 Executor Service 线程永远不会死的原因。超时在这里不是一个选项。你应该在你已经完成的实现中有一个超时。仅当由于使用了某些外部服务(例如数据库或 http 服务)而挂起时,才能执行此操作。除此之外,您必须确保本地代码中不会发生线程锁。使用分析器找出这些问题。

【讨论】:

  • 是的,假设数据库发生了阻塞问题,我们不希望线程挂起一段时间,所以我们需要杀死它。
  • 不.. 你不应该杀死线程。您应该为数据库连接设置适当的超时。如果超时默认为更高的值,则该线程将需要更长的时间才能完成。如果由于我上面提到的其他原因,你必须做我上面提到/建议的事情。如果所有线程都无法恢复,最后一件事是重新启动您的应用程序并修复您遇到的问题。
  • ,是的,对于数据库我们可以设置超时,那么如果没有办法为其他外部数据源设置超时呢?
  • 总有一些方法可以为任何类型的外部服务设置超时。当使用或锁定同一线程的某些内部含义出现问题时,就会出现致命问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多