我正在使用固定大小的Java线程池(ExecutorService)。假设我向线程池提交了一个作业,并且该作业处于空闲状态。
是否有可能从线程池中删除空闲作业,以便可以处理队列中的其他作业,然后再添加空闲作业?
任务或Runnable
可能处于空闲
(我想等待I/O或其他一些资源)这一事实是主要原因之一,因为适合使用线程池。
另一方面,您要使用的线程量是您需要调整的,以便在某些线程被阻塞等待资源时处理任务。
您唯一需要做的就是观察线程空闲的频率,并相应地调整线程量。
不要对同步等待其他任务结果的任务排队。这可能会导致上述形式的死锁,其中所有线程都被任务占用,而这些任务又在等待队列中的任务的结果,这些任务由于所有线程都很忙而无法执行。
在使用池线程进行潜在的长期操作时要小心。如果程序必须等待资源(如I/O完成),请指定最长等待时间,然后失败或重新请求任务以便稍后执行。这保证了通过释放线程来完成可能成功完成的任务,最终会取得一些进展。
了解您的任务。为了有效地调整线程池大小,您需要了解正在排队的任务以及它们在做什么。它们是否受CPU限制?它们是否受I/O限制?您的答案将影响您调整应用程序的方式。如果您有具有完全不同特征的不同类别的任务,那么为不同类型的任务设置多个工作队列可能是有意义的,因此可以相应地调整每个池。
如果您从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