线程创建方法是否会等待线程获得空闲? 我可以减少使用线程池生成的线程数吗?
答案 0 :(得分:3)
如果使用缓存线程池,则池将创建更多线程。但是,这只是任何时候所需的最大值,可能远远小于您提交的任务数量。
如果使用固定大小的线程池,它将创建固定数量的线程,无论您是否为其提供任何任务,或者您为其提供的任务多于它可以执行的任务。它将排队任何正在等待的任务。
线程创建方法是否会等待线程获得空闲?
虽然您可以创建执行此操作的队列,但这不是默认行为。更常见的解决方案是在需要时让调用者执行任务。
我可以减少使用线程池生成的线程数吗?
如果限制线程数,线程池可能会产生比任务esp少得多的线程。
答案 1 :(得分:1)
线程创建方法是否会等待线程获得空闲?
这与你的头衔相矛盾。您通常会提交一个任务,并且当一个可用时,池会将该任务传递给工作线程。所以你不是创建一个线程,而是提交一个任务。是等待执行任务还是仅触发异步执行(在大多数情况下是默认执行)取决于您的系统和要求。
我可以减少使用线程池生成的线程数吗?
线程池通常用于减少创建的线程数,即不是每个任务都有一个线程,而是有一个已定义的(最大)工作线程数,因此如果#tasks > max threads in pool
,你将减少需要线程。
答案 2 :(得分: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)。
基本上,您可以设置两种尺寸:“核心”尺寸和“最大”尺寸。提交任务时,如果少于“核心”线程,将创建一个新线程来执行该任务。如果存在大于“核心”的线程,则将使用当前线程之一来执行任务,除非所有当前线程都忙。如果所有当前线程都忙,则会创建更多线程,最大为“max”。一旦达到“最大”线程数,将不再创建更多线程,并且新任务将排队,直到线程可用于运行它们。
在一般情况下,线程池没有“正确”的方式。可以使用任何给定的实现:始终具有X个线程的固定大小的线程池,或者总是增长到最大限制的线程池等。
答案 3 :(得分:0)
ThreadPoolExecutor's
提交的方法将抛出RejectedExecutionException
。