Java ScheduledExecutorService для периодического запуска
Я пытаюсь запустить задание [которое содержит 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 для достижения этой цели.
1 ответ
Ваш 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);
Для простоты я сохранил сервисы в коллекции. При необходимости вы также можете создавать их заново каждый раз.