安排任务,每 1 小时更新一次主列表

问题描述

我需要每 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 包装器)。