1

如果我有一个线程池:

ExecutorService e = Executors.newFixedThreadPool(noOfThreads);

我开始精确地“noOfThreads”运行。现在如果我想添加另一个线程,我怎么知道我超过了线程池的线程数?

4

2 回答 2

2

即使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。

于 2012-12-15T17:55:38.427 回答
1

作为练习,你可以这样做,但我不建议这样做。多线程已经够难了,不用尝试使用线程大小。

检测您是否需要另一个线程的一种简单方法是检查队列大小。

 if(!tpe.getQueue().isEmpty()) {
     itn size = tpe.getCorePoolSize()+1;
     tpe.setCorePoolSize(size);
     tpe.setMaximumPoolSize(size);
 }
于 2012-12-15T18:38:07.533 回答