栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

手撸不执行重复任务的线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

手撸不执行重复任务的线程池

        业务场景是这样的,有表A、表B。

        因为表B的数据是从表A中统计出来的,因此当表A的数据被更新时,就需要重新统计表B的数据。为了提高操作的响应速度,想到了先返回操作成功再异步执行统计逻辑(业务对数据强一致性要求不高)。

        在使用异步时就想用线程池来执行任务,但是多个相同的统计任务在队列中等待被执行是不合理的,因此作者就想是否能直接抛弃之前未执行的相同参数任务,只保留一个任务。

        在查看了java原生线程池后,遗憾的发现好像没有线程池能满足作者的这个需求,因此自己手撸了一个超简易版线程池,请大佬们给点改进建议

public class CustomThreadPool {

    
    private static final int THREAD_COUNT = 5;

    
    private static final int QUEUE_COUNT = 100;

    
    private final BlockingQueue taskQueue;

    
    public CustomThreadPool(int workNum, int taskCount) {
        if (workNum <= 0) {
            workNum = THREAD_COUNT;
        }
        if (taskCount <= 0) {
            taskCount = QUEUE_COUNT;
        }
        taskQueue = new ArrayBlockingQueue<>(taskCount);
        WorkThread[] workThreads = new WorkThread[workNum];
        for (int i = 0; i < workNum; i++) {
            workThreads[i] = new WorkThread();
            workThreads[i].start();
        }

    }

    
    public void execute(TaskDTO dto) throws InterruptedException {

        //移除队列中相同的任务
        taskQueue.forEach(task -> {
            if (task.getKey().equals(dto.getKey())) {
                taskQueue.remove(task);
            }
        });

        taskQueue.put(dto);
    }

    
    private class WorkThread extends Thread {
        @SneakyThrows
        @Override
        public void run() {
            Runnable r = null;
            while (!interrupted()) {
                if (taskQueue.size() > 0) {
                    r = taskQueue.take().getTask();
                    r.run();
                    r = null;
                }
            }
        }
    }
}

        这样已经能实现基本需求了,但是还有个问题我没有解决。我想在相同参数任务进来后能够立马中止正在执行的相同参数任务,因为A表数据已经发生变化,正在执行的统计已经没有意义了,这方面不知道诸位大佬有没有什么好的想法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/682452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号