如果我有一个线程池:
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);
我开始精确地“noOfThreads”运行。现在如果我想添加另一个线程,我怎么知道我超过了线程池的线程数?
如果我有一个线程池:
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);
我开始精确地“noOfThreads”运行。现在如果我想添加另一个线程,我怎么知道我超过了线程池的线程数?
即使Executors.newFixedThreadPool()
返回一个 type 的实例ExecutorService
,底层实现实际上是ThreadPoolExecutor
该类的一个实例。您可以按如下方式转换为该类型:
ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(noOfThreads);
然后,您可以检查是否e.getActiveCount() == e.getMaximumPoolSize()
. 如果该条件为真,那么您就知道您没有任何线程可用。
不过,一般来说,您的应用程序不需要执行这些类型的检查。这些低级线程池操作被抽象出来,因为应用程序中使用的组件ExecutorService
应该与线程池内部分离。
相反,您应该在设计/开发应用程序时为您的线程池确定适当的设置,这样您的线程就不会在提交队列中停留不合理的时间。
编辑:
根据您在评论中提供的其他详细信息,以下是ThreadPoolExecutor
文档中有关如何在构造后修改线程池大小的一些其他信息:
最典型的是,核心和最大池大小仅在构造时设置,但它们也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 动态更改。
如果您需要线程池中的其他自定义行为,您最好手动实例化一个实例ThreadPoolExecutor
并自己配置它。(Executors
工厂方法只提供有用的预设配置。)有关ThreadPoolExecutor
详细信息,请参阅 javadocs。
作为练习,你可以这样做,但我不建议这样做。多线程已经够难了,不用尝试使用线程大小。
检测您是否需要另一个线程的一种简单方法是检查队列大小。
if(!tpe.getQueue().isEmpty()) {
itn size = tpe.getCorePoolSize()+1;
tpe.setCorePoolSize(size);
tpe.setMaximumPoolSize(size);
}