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

Для простоты я сохранил сервисы в коллекции. При необходимости вы также можете создавать их заново каждый раз.

Другие вопросы по тегам