/* * Copyright 2015 Adam Bien. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.airhacks.porcupine.execution.control; import static java.lang.Math.min; import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * * @author airhacks.com */ public class InstrumentedThreadPoolExecutor extends ThreadPoolExecutor { private int minRemainingQueueCapacity; public InstrumentedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); this.minRemainingQueueCapacity = workQueue.remainingCapacity(); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); } @Override protected void beforeExecute(Thread t, Runnable r) { super.beforeExecute(t, r); int current = super.getQueue().remainingCapacity(); this.minRemainingQueueCapacity = min(this.minRemainingQueueCapacity, current); } public int getMinRemainingQueueCapacity() { return minRemainingQueueCapacity; } }