import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
* @Description
* @Date 2022-07-06 9:23 AM
*/
public class FeedProcessor extends AbstractFeedProcessor {
private ExecutorService threadPool = Executors.newFixedThreadPool(6);
private Map<Integer, List<Integer>> resultList = new ConcurrentHashMap<>();
public FeedProcessor() {
}
public void add(DataItem item) {
threadPool.submit(new ProcessTask(item));
}
class ProcessTask implements Runnable {
private DataItem item;
ProcessTask(DataItem item) {
this.item = item;
}
@Override
public void run() {
for(;;){
int id = item.getId();
List<Integer> list = resultList.get(id);
// 如果版本号为 1 则可以继续执行
if(list == null && item.getVersion() == 1){
saveItem(item);
list = new ArrayList<>();
list.add(item.getVersion());
resultList.put(id, list);
break;
} else {
// 最后一个版本号 + 1 等于自己的版本号,则轮到该任务执行
if(list != null && list.get(list.size() -1) + 1 == item.getVersion() ){
saveItem(item);
list.add(item.getVersion());
resultList.put(id, list);
break;
} else {
try {
TimeUnit.MILLISECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public void shutdown() {
threadPool.shutdown();
try {
threadPool.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
多线程
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 共17篇博文【白话经典算法系列之十七】 数组中只出现一次的数数组A中,除了某一个数字x之外,其他数字都出现了三次,...
- 01-多线程(概述) 接下来,我们来说一说Java中特有的一个知识技术:多线程。 在说线程这个概念...
- 08-多线程(守护线程) 接下来说一下Thread类中的其他方法。 点进去看一看: 我们试...
- 在软件层面,多线程就是能同时从多个路线同时执行处理。从软件的角度来说,线程可以看作是同时的。 即便在单核处理器的电...
- 方式 NSThread iOS2.0出现 GCD的出现是为了替代 NSThread 的,缺点是纯 C 语言的框架,...