繁体   English   中英

Java ScheduledExecutorService定期运行

[英]Java ScheduledExecutorService to run periodically

我尝试每分钟运行一次作业(其中应并行运行3个服务) 以下是我的代码段。

ExecutorService service = Executors.newFixedThreadPool(servicesMap.size());
for (Map.Entry entry : servicesMap.entrySet()) {
    service.submit(new MyService(conn, serviceID)); 
   // here serviceID is id1 id2 id3 these three job should execute parallel
}

注意:MyTask实现Callable&servicesMap始终为3

如果我尝试使用ScheduledExecutorService,则无法实现它。 它说scheduleService.schedule不接受Callable类型parameterts

ScheduledExecutorService scheduleService = Executors.newScheduledThreadPool(servicesMap.size());
for (Map.Entry entry : servicesMap.entrySet()) {
    scheduleService.schedule((new MyService(conn, serviceID)), 0, 60, TimeUnit.SECONDS);
}

请帮助修改ScheduledExecutorService代码以实现此目的。

您的schedule(…)调用包含的参数多于该方法具有的参数。

不过,我不确定你到底在追求什么。 如果您希望将来一分钟内运行服务,请使用以下电话:

scheduleService.schedule(new MyService(conn, serviceID), 60, TimeUnit.SECONDS);

相反,如果您想每分钟运行一次服务(立即开始),请使用以下两个调用之一:

scheduleService.scheduleAtFixedRate(new MyService(conn, serviceID), 0, 60, TimeUnit.SECONDS);
scheduleService.scheduleWithFixedDelay(new MyService(conn, serviceID), 0, 60, TimeUnit.SECONDS);

关于您在评论中的后续问题:

如何制作,在一分钟内Service1 Service2 Service3应该并行运行,然后在下一分钟做同样的事情。

ScheduledExecutorService scheduleService = …;
Collection<Callable<Void>> services = …;
Runnable svcRunner = new Runnable() {
    @Override
    public void run() {
        Collection<Future<Void>> futures = new ArrayList<>(services.size());
        // start all services in parallel
        for (Callable<Void> service : services) {
            // any ExecutorService would do here, i.e., doesn't have to be a
            // ScheduledExecutorService
            futures.add(scheduleService.submit(service));
        }
        // wait for all services to complete
        for (Future<Void> future : futures) {
            try {
                future.get();
            } catch (InterruptedException | ExecutionException e) {
                // TODO do something meaningful
            }
        }
    }
};
// run the scheduler every minute (i.e., one minute after the last service
// has finished), starting now
scheduleService.scheduleWithFixedDelay(svcRunner, 0, 60, TimeUnit.SECONDS);

为简单起见,我将服务存储在一个集合中。 如果需要,您也可以每次重新创建它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM