业务场景是这样的,有表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表数据已经发生变化,正在执行的统计已经没有意义了,这方面不知道诸位大佬有没有什么好的想法



