首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java full ThreadPool?

Java full ThreadPool?
EN

Stack Overflow用户
提问于 2012-12-16 01:27:17
回答 2查看 1.5K关注 0票数 1

如果我有一个线程池:

代码语言:javascript
复制
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);

我从“noOfThreads”runnables开始。现在,如果我想添加另一个线程,我如何知道我已经超过了线程池的数量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-16 01:55:38

尽管Executors.newFixedThreadPool()返回类型为ExecutorService的实例,但底层实现实际上是ThreadPoolExecutor类的实例。您可以转换为该类型,如下所示:

代码语言:javascript
复制
ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(noOfThreads);

然后,您可以检查e.getActiveCount() == e.getMaximumPoolSize()。如果该条件为真,那么您就知道没有任何线程可用。

不过,一般来说,您的应用程序不应该需要执行这些类型的检查。这些低级线程池操作被抽象出来,因为使用ExecutorService的应用程序组件应该与线程池内部部分解耦。

相反,您应该在设计/开发应用程序时为线程池确定适当的设置,这样线程就不会在提交队列中停留不合理的时间。

编辑:

根据您在注释中提供的其他详细信息,下面是来自ThreadPoolExecutor documentation的一些有关如何在构造后修改线程池大小的附加信息:

int最典型的情况是,核心和最大池大小仅在构造时设置,但也可以使用setCorePoolSize(

)和setMaximumPoolSize(int)动态更改。

如果您需要线程池中的其他自定义行为,最好手动实例化ThreadPoolExecutor实例并自己配置它。( Executors工厂方法仅提供有用的预设配置。)有关详细信息,请参阅ThreadPoolExecutor javadoc。

票数 2
EN

Stack Overflow用户

发布于 2012-12-16 02:38:08

作为练习,您可以这样做,但我不建议这样做。如果不尝试调整线程的大小,多线程已经够难的了。

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

代码语言:javascript
复制
 if(!tpe.getQueue().isEmpty()) {
     itn size = tpe.getCorePoolSize()+1;
     tpe.setCorePoolSize(size);
     tpe.setMaximumPoolSize(size);
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13894453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档