问题描述
我需要每 10 分钟创建一个计划任务,该任务将处理在数据库中查询的列表。但该对象列表需要每 1 小时更新一次以获取新数据。如何每 1 小时刷新一次 dataList?
到目前为止,这是我尝试过的,假设 run() 是主要方法:
public class Handler {
private static final scheduledexecutorservice scheduledexecutorservice = scheduledexecutorservice.wrap(
new ScheduledThreadPoolExecutor(3),"handler-thread-%d");
private void run(DB db) {
scheduledexecutorservice .scheduleAtFixedrate(new Impl(),1,10,TimeUnit.MINUTES);
}
private class Impl implements Runnable {
private List<Object> dataList;
@Override
public void run() {
initialize();
dataList.forEach(data-> {
soMetask(data);
});
}
private void initialize() {
dataList= new ArrayList<>();
dataList = getFromDB();
}
}
}
解决方法
dataList 应该在所有相关线程之间共享。 但是,请注意您正在为每次迭代创建一个新列表,因此对象本身已被覆盖。 我想您应该清除现有列表并使用它来创建一个新列表(或者使用 Reference 包装器)。