2014-02-21 43 views
4

线程创建方法是否等待线程获得空闲? 我可以减少使用线程池生成的线程数吗?当线程池中没有线程空闲并且我们向池中提交任务时会发生什么?

+0

这不是发生了什么;在内部,一个线程池维护一个'Callable'队列,并为一个线程分配一个'Callable',当一个线程“可以使用”时。 – fge

+0

你是否在谈论['ThreadPoolExecutor'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)或更一般的东西? – erickson

回答

2

如果您使用缓存线程池,该池将创建更多线程。但是,这只会是任何时候所需的最大值,并且可能远远低于您提交的任务数量。

如果使用固定大小的线程池,它将创建固定数量的线程,无论您是否给它任何任务,或者如果您给它多任务比它可以做。它会排队正在等待的任何任务。

线程创建方法是否等待线程获得空闲?

虽然您可以创建一个队列来完成此操作,但这不是默认行为。如果需要,更常见的解决方案是让调用者执行任务。

我可以减少使用线程池生成的线程数吗?

如果限制线程数,线程池可能会产生比任务更少的线程。

1

线程创建方法是否等待线程获得空闲?

与您的标题相矛盾。你通常会提交一个任务,当有一个任务可用时,池会将该任务传递给工作线程。所以你不会创建一个线程,但提交一个任务。无论您是等待任务执行还是触发异步执行(大多数情况下都是默认执行)取决于您的系统和要求。

我可以减少使用线程池生成的线程数吗?

线程池通常被用来减少创建的线程数,即而不是每个任务一个线程,你有工作线程的定义(最大)的数量,因此如果#tasks > max threads in pool你降低线程数需要。

1

从ThreadPoolExecutor的文档:

甲的ThreadPoolExecutor将自动调整池大小(参见 getPoolSize())根据由corePoolSize设定的界限(参见 getCorePoolSize())和maximumPoolSize(参见getMaximumPoolSize( ))。 当在方法execute(java.lang.Runnable)中提交新任务时, 且少于corePoolSize线程正在运行时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求,即 。 如果有多于corePoolSize但小于maximumPoolSize 的线程正在运行,则仅当队列为 已满时才会创建新线程。通过设置corePoolSize和maximumPoolSize相同,您可以创建一个固定大小的线程池 。通过将maximumPoolSize设置为实质上为 的无限值(例如Integer.MAX_VALUE),您允许池允许任意数量的并发任务容纳 。最通常, 核心和最大池大小仅在构建时设置,但它们也可以使用setCorePoolSize(int)和 setMaximumPoolSize(int)动态更改。

基本上,您可以设置两种尺寸:“核心”尺寸和“最大”尺寸。提交任务时,如果少于'核心'线程,将创建一个新线程来执行该任务。如果有大于'core'的线程,则当前线程中的一个将用于执行任务,除非当前所有线程都处于忙碌状态。如果当前所有线程都处于忙碌状态,则会创建更多的线程,达到“最大”大小。一旦达到“最大”线程数量,就不会再创建任何更多的任务,并且新的任务将排队等待一个线程可用来运行它们。

在一般情况下,线程池没有“正确”的方式工作。任何给定的实现都可以使用:固定大小的线程池,它总是有X个线程,或者线程池总是增长到最大限制,等等。

相关问题