Java 当线程池中没有空闲线程,我们向线程池提交任务时会发生什么?

Java 当线程池中没有空闲线程,我们向线程池提交任务时会发生什么?,java,multithreading,threadpool,Java,Multithreading,Threadpool,线程创建方法会等待线程释放吗? 我可以减少使用线程池生成的线程数吗?如果使用缓存线程池,该池将创建更多线程。但是,这只是任何时候所需的最大值,可能远远少于您提交的任务数 如果使用固定大小的线程池,它将创建固定数量的线程,而不管您是否为其分配任务,或者您是否为其分配了超出其能力范围的任务。它将对任何正在等待的任务进行排队 线程创建方法会等待线程释放吗 虽然您可以创建一个执行此操作的队列,但这不是默认行为。更常见的解决方案是,如果需要,让调用方执行任务 我可以减少使用线程池生成的线程数吗 线程池产生

线程创建方法会等待线程释放吗?
我可以减少使用线程池生成的线程数吗?

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

如果使用固定大小的线程池,它将创建固定数量的线程,而不管您是否为其分配任务,或者您是否为其分配了超出其能力范围的任务。它将对任何正在等待的任务进行排队

线程创建方法会等待线程释放吗

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

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

线程池产生的线程可能远远少于任务,特别是在限制线程数量的情况下

线程创建方法会等待线程释放吗

这与你的头衔相矛盾。您通常会提交一个任务,当工作线程可用时,池会将该任务传递给工作线程。因此,您不会创建线程,而是提交任务。您是等待任务执行,还是仅仅触发异步执行(在大多数情况下是默认的),取决于您的系统和需求

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


线程池通常用于减少创建的线程数,也就是说,不是每个任务有一个线程,而是定义了(最大)工作线程数,因此如果
#tasks>max threads in pool
,您将减少所需的线程数。

来自ThreadPoolExecutor文档:

ThreadPoolExecutor将自动调整池大小(请参阅 getPoolSize())根据corePoolSize设置的边界(请参阅 getCorePoolSize()和maximumPoolSize(请参阅getMaximumPoolSize())。 在方法execute(java.lang.Runnable)中提交新任务时, 如果运行的线程少于corePoolSize,则会创建一个新线程 创建以处理请求,即使其他工作线程处于空闲状态。 如果超过corePoolSize但小于maximumPoolSize 线程运行时,仅当队列为 满满的。通过将corePoolSize和maximumPoolSize设置为相同,可以创建 固定大小的线程池。通过将maximumPoolSize设置为 无界值,如Integer.MAX_值,则允许池 可容纳任意数量的并发任务。最典型的是, 核心池和最大池大小仅在施工时设置,但 也可以使用setCorePoolSize(int)和 setMaximumPoolSize(int)

基本上,您可以设置两种尺寸:“核心”尺寸和“最大”尺寸。提交任务时,如果少于“核心”线程,将创建一个新线程来执行该任务。如果存在多个“核心”线程,则将使用其中一个当前线程执行任务,除非所有当前线程都很忙。如果所有当前线程都很忙,将创建更多的线程,最大大小为“max”。一旦达到“最大”线程数,将不再创建更多线程,新任务将排队,直到有线程可运行它们


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

ThreadPoolExecutor的
submitted方法在任务无法计划执行时抛出
RejectedExecutionException
;在内部,线程池维护一个由
Callable
s组成的队列,并将一个
Callable
退出队列,以便在“可以自由使用”时分配给线程。您是在谈论还是更一般的问题?您的回答中只错了一件事:当所有核心线程都忙时,输入任务将被放入队列中,如果队列已满,则将创建一个新线程,最大为maxPoolSize。