java - 使用 Executors 时的空 Map
问题描述
我试图在给定的时间范围内,每分钟计算与type
a 中的参数相同的记录。List
使用以下方法:
public Map<String, Object> getCountPerMinuteForType(final String type,
final long startTimestamp,
final long endTimestamp) {
final Map<String, Object> countsPerMinForType = new HashMap<>();
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
int counter = 0;
List<Data> dataList = storage.retrieveData();
for(Data data: dataList){
if (data.getType().equals(type) &&
data.getUnixTimestamp() >= startTimestamp &&
data.getUnixTimestamp() <= endTimestamp){
counter++;
}
}
countsPerMinForType.put(type, counter);
}, 0, 1, TimeUnit.MINUTES);
return countsPerMinForType;
}
问题是,这个方法返回一个空的Map
。
当我打印Map
里面的内容时Executors
,我可以看到它有数据。
解决方案
您遇到的问题是您期望您正在剥离的线程已完成工作并countsPerMinForType
返回填充的结果。这不是正在发生的事情......
正在发生的事情是:
- 您从执行的主/当前线程调用该方法
- 被
Map
创建 - 一个新线程被剥离出来做一些工作
- 几乎立即,该方法返回并且地图仍然是空的。...
- 方法完成后,将执行分拆线程正在执行的工作......随后调用方法永远不会看到结果。
您可以通过一个测试来确认这种情况,该测试在开始和结束时返回一个timestamp
,在getCountPerMinuteForType
开始和结束timestamp
时返回另一个Thread
。开始时间将按顺序排列,结束时间将不按顺序排列。
此外,您可能需要考虑将 aConcurrentHashMap
用于多线程应用程序。
推荐阅读
- vba - Me!control_textbox.Requery 运行时错误 '438' 对象不支持此属性或方法
- html - HTML - 由 tbody 元素建立的行组的第 2 行没有以它开头的单元格
- python - 如何修复值错误:“CB7”不在列表中?
- arrays - 如何检查直线多边形是否相交
- typo3 - 有时不会生成排版链接
- javascript - 即使凭据设置为“包含”,Cookie 也不会随 Fetch API CORS 请求一起发送
- python - 如何将变量从 python 移动到模板并返回?
- python - 有没有办法使用 python-docx 将所有项目符号列表替换为 docx 文件中的编号列表?
- javascript - 在 Laravel Inertia Vue 中初始化服务器端多列排序
- javascript - 为每个索引处存在的值过滤 javascript 多维数组