当前位置: 首页 > 知识库问答 >
问题:

在Java中从线程池中删除空闲线程?

宗穆冉
2023-03-14

我正在使用固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,并且该作业处于空闲状态。

是否有可能从线程池中删除空闲作业,以便可以处理队列中的其他作业,然后再添加空闲作业?

共有2个答案

呼延俊风
2023-03-14

任务或Runnable可能处于空闲(我想等待I/O或其他一些资源)这一事实是主要原因之一,因为适合使用线程池。

另一方面,您要使用的线程量是您需要调整的,以便在某些线程被阻塞等待资源时处理任务。

您唯一需要做的就是观察线程空闲的频率,并相应地调整线程量。

不要对同步等待其他任务结果的任务排队。这可能会导致上述形式的死锁,其中所有线程都被任务占用,而这些任务又在等待队列中的任务的结果,这些任务由于所有线程都很忙而无法执行。

在使用池线程进行潜在的长期操作时要小心。如果程序必须等待资源(如I/O完成),请指定最长等待时间,然后失败或重新请求任务以便稍后执行。这保证了通过释放线程来完成可能成功完成的任务,最终会取得一些进展。

了解您的任务。为了有效地调整线程池大小,您需要了解正在排队的任务以及它们在做什么。它们是否受CPU限制?它们是否受I/O限制?您的答案将影响您调整应用程序的方式。如果您有具有完全不同特征的不同类别的任务,那么为不同类型的任务设置多个工作队列可能是有意义的,因此可以相应地调整每个池。

国兴文
2023-03-14

如果您从ExecutorService移动到ThreadPoolExecutor,可以使用以下API实现

public void setCorePoolSize(int corePoolSize)

设置线程的核心数。这将覆盖构造函数中设置的任何值。如果新值小于当前值,那么多余的现有线程将在下次变为空闲时终止。

如果更大,如果需要,将启动新线程来执行任何排队的任务。

如果要在运行时重新调整池的大小,

((ThreadPoolExecutor)服务)。setCorePoolSize(新限制) //newLimit是池的新大小

其他API:

public void setMaximumPoolSize(int maximumPoolSize)

设置允许的最大线程数。这将覆盖构造函数中设置的任何值。如果新值小于当前值,那么多余的现有线程将在下次变为空闲时终止。

 类似资料:
  • 在配置DBCP2池时,根据文档,我注意到-有一个名为timebetweenvictionrunsmillis的配置,描述如下: 空闲对象逐出器线程运行之间的Hibernate毫秒数。如果为非正,则不会运行空闲对象逐出器线程。 其默认值为-1。 这是否意味着逐出器线程永远不会在默认配置下运行?那么配置参数maxIdle是如何强制的?如果空闲连接的计数大于maxIdle,池必须退出空闲连接。 默认配置

  • > 我是Java多线程的新手。想知道线程池执行器中空闲线程的状态。它在RUNNABLE/WAITING中吗? 如果空闲线程处于RUNNABLE状态,新任务如何附加到空闲线程?AFAIK我们为线程/池分配一个可运行/可调用的对象。但我的问题是ThreadPoolExecitor如何将排队的可运行对象分配给空闲线程??

  • 主要内容:1 什么是Java 线程池,2 Java 线程池的优势,3 Java 线程池的应用场景,4 Java 线程池的例子1 什么是Java 线程池 Java线程池 表示一组正在等待作业并多次重复使用的工作线程。 如果是线程池,则会创建一组固定大小的线程。服务提供商从线程池中拉出一个线程并为其分配作业。作业完成后,线程再次包含在线程池中。 2 Java 线程池的优势 由于无需创建新线程,因此拥有更好的性能,可以节省时间。 3 Java 线程池的应用场景 在用户请求Servlet和JSP时,其中

  • 根据ThreadPoolExecutor文档(Java ThreadPoolExecutor),如果我像这样创建一个executor服务: 当#线程

  • 打印空闲线程钩子函数的运行次数 打印空闲线程钩子函数的运行次数 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the first v

  • 每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime