【发布时间】:2016-08-30 12:49:40
【问题描述】:
假设我们通过代码ExecutorService executorService = Executors.newFixedThreadPool(100) 创建了 100 个线程,不幸的是,假设这 100 个线程全部挂起,在这种情况下,线程池中没有空闲线程可以使用,也无法处理新的请求。那么如何处理这种情况呢?强制中止挂起线程并让它返回线程池?如果是如何强制中止线程?或者如果有超时可以使用,超时后挂起线程会自动中止,并返回线程池?
【问题讨论】:
-
这是 XY 问题吗?你知道为什么线程会挂起吗?
-
同意@bradimus,解决方案是不要编写挂起的代码。 Java 中的大多数阻塞操作都有超时版本的方法(例如,参见 docs.oracle.com/javase/7/docs/api/java/net/… 与 docs.oracle.com/javase/7/docs/api/java/net/… )。无论工作发生在线程池还是主线程中,您通常都应该使用可超时版本的方法。
-
你可以关闭线程池:-)
-
我想你可以看看这个:docs.oracle.com/javase/7/docs/api/java/util/concurrent/… 有类似的东西:
ThreadPoolExecutor.DiscardOldestPolicy和setKeepAliveTime(TimeUnit t) -
修复导致这种情况的代码似乎是最佳选择。
标签: java multithreading threadpool