如果我有一个线程池:
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);我从“noOfThreads”runnables开始。现在,如果我想添加另一个线程,我如何知道我已经超过了线程池的数量?
发布于 2012-12-16 01:55:38
尽管Executors.newFixedThreadPool()返回类型为ExecutorService的实例,但底层实现实际上是ThreadPoolExecutor类的实例。您可以转换为该类型,如下所示:
ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(noOfThreads);然后,您可以检查e.getActiveCount() == e.getMaximumPoolSize()。如果该条件为真,那么您就知道没有任何线程可用。
不过,一般来说,您的应用程序不应该需要执行这些类型的检查。这些低级线程池操作被抽象出来,因为使用ExecutorService的应用程序组件应该与线程池内部部分解耦。
相反,您应该在设计/开发应用程序时为线程池确定适当的设置,这样线程就不会在提交队列中停留不合理的时间。
编辑:
根据您在注释中提供的其他详细信息,下面是来自ThreadPoolExecutor documentation的一些有关如何在构造后修改线程池大小的附加信息:
int最典型的情况是,核心和最大池大小仅在构造时设置,但也可以使用setCorePoolSize(
)和setMaximumPoolSize(int)动态更改。
如果您需要线程池中的其他自定义行为,最好手动实例化ThreadPoolExecutor实例并自己配置它。( Executors工厂方法仅提供有用的预设配置。)有关详细信息,请参阅ThreadPoolExecutor javadoc。
发布于 2012-12-16 02:38:08
作为练习,您可以这样做,但我不建议这样做。如果不尝试调整线程的大小,多线程已经够难的了。
检测是否需要另一个线程的一个简单方法是检查队列大小。
if(!tpe.getQueue().isEmpty()) {
itn size = tpe.getCorePoolSize()+1;
tpe.setCorePoolSize(size);
tpe.setMaximumPoolSize(size);
}https://stackoverflow.com/questions/13894453
复制相似问题