ThreadPoolExecutor记录任务在池里面的排队时长:
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
int threadCoreSize = 2;
MyThreadPollExecutor<MyTask> executor = new MyThreadPollExecutor<>(threadCoreSize, threadCoreSize, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(threadCoreSize * 3));
for (int i = 0; i < threadCoreSize * 3; i++) {
MyTask task = new MyTask(i);
executor.submit(task);
}
executor.shutdown();
}
}
class MyThreadPollExecutor<T extends MyTask> extends ThreadPoolExecutor {
public MyThreadPollExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
/**
* 提交任务
*
* @param t 任务继承自@MyTask
*/
public void submit(T t) {
t.setSubmitTime(Instant.now());// 任务提交之前设置时间
super.submit(t);
}
}
class MyTask implements Runnable {
private Instant submitTime;
private int taskId;
public MyTask(int taskId) {
this.taskId = taskId;
this.submitTime = Instant.now(); // 初始化防止ChronoUnit.SECONDS.between方法NPE
}
/**
* 设置任务提交时刻
*
* @param submitTime 任务提交时刻
*/
public void setSubmitTime(Instant submitTime) {
this.submitTime = submitTime;
}
@Override
public void run() {
System.out.printf("task: %s queuing time(s): %s\n", taskId, ChronoUnit.SECONDS.between(submitTime, Instant.now()));
try {
Thread.sleep(1000); // 模拟任务运行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

网友评论