美文网首页
ThreadPoolExecutor记录任务排队时长

ThreadPoolExecutor记录任务排队时长

作者: 小菜鸡 | 来源:发表于2022-10-27 23:32 被阅读0次

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();
        }
    }
}
运行结果

相关文章

网友评论

      本文标题:ThreadPoolExecutor记录任务排队时长

      本文链接:https://www.haomeiwen.com/subject/vdwftdtx.html