gpt4 book ai didi

Java ScheduledExecutorService 定期运行

转载 作者:行者123 更新时间:2023-12-01 08:48:17 24 4
gpt4 key购买 nike

我正在尝试每分钟运行一个作业[其中包含 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类型参数

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

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

最佳答案

您的 schedule(…) 调用包含的参数多于 the method有参数。

不过,我不确定你到底想要什么。如果您想在未来一分钟内运行您的服务,请使用以下调用:

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);
<小时/>

关于评论中的后续问题:

How to make, within a minute Service1 Service2 Service3 should run parallel, then next minute do the same.

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);

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

关于Java ScheduledExecutorService 定期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42548565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com