这个问题在这里已有答案:
我正在运行一个使用固定线程池的Java应用程序,其中线程用于向外部服务发出HTTP请求。
线程池故意过度配置,我想获得一些使用线程池的测量(即,此时,池中20%的线程是空闲的,此时另外30%的线程忙)。
有没有一种有效的方法来检查线程池(通过Executors.newFixedThreadPool(x)创建)的当前执行任务的比例是多少?
我曾考虑创建一个特殊的监视器线程,该线程不断运行Callable任务,报告利用率,但我不确定这是否会影响胎面池本身的性能(通过使线程响应监视器而不是进行HTTP调用) )。
以下所有内容均涉及:
package java.util.concurrent;
如果您可以绕过工厂方法并直接创建“ThreadPoolExecutor”实例,那么您可以使用监视器线程并调用“ThreadPoolExecutor.getActiveCount”(以及其他有用的方法)来告诉线程池状态。
不幸的是,'Executors'上的工厂方法没有公开'ThreadPoolExecutor':返回类型是'ExecutorService',并且没有公开必要的方法。您必须直接实例化线程池执行程序。
我查找了可以在线程池启动线程时运行的可覆盖方法,或者当托管线程停止时,并且没有找到任何有用的非私有方法。否则,通过覆盖那些显示线程池状态的方法对线程池进行子类化将是监视不需要监视器线程的线程池状态的另一种方法。
public class Executors {
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public interface ExecutorService extends Executor {
public interface Executor {
public abstract class AbstractExecutorService implements ExecutorService {
public class ThreadPoolExecutor extends AbstractExecutorService {
/**
* Returns the approximate number of threads that are actively
* executing tasks.
*
* @return the number of threads
*/
public int getActiveCount();