我需要某种服务,该服务将在1秒的间隔内同时运行1分钟1分钟。
如果其中一项任务失败,则我想停止该服务,并停止运行该服务的每个任务,并带有某种指示错误的指示器,否则,如果在一分钟后一切正常,则该服务将停止并指示所有指示器均正常运行。
例如,我有2个功能:
Runnable task1 = ()->{
int num = Math.rand(1,100);
if (num < 5){
throw new Exception("something went wrong with this task,terminate");
}
}
Runnable task2 = ()->{
int num = Math.rand(1,100)
return num < 50;
}
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
task1schedule = scheduledExecutorService.scheduleAtFixedRate(task1, 1, 60, TimeUnit.SECONDS);
task2schedule = scheduledExecutorService.scheduleAtFixedRate(task2, 1, 60, TimeUnit.SECONDS);
if (!task1schedule || !task2schedule) scheduledExecutorService.shutdown();
关于如何解决这个问题并使之尽可能通用的任何想法?
将任务安排为每分钟重复一次是没有意义的,但是然后说,您要停止任务“如果一分钟后一切都顺利”。由于在两种情况下都将停止执行程序,因此安排一分钟后关闭执行程序的任务很简单。期货确实已经表明是否出了问题。您没有说,还想要什么其他类型的指标。
—
Holger
Math.rand
不是内置的API。的实现Runnable
必须具有void run
定义。类型task1/2schedule
将ScheduledFuture<?>
在提供的上下文中。转到实际问题,如何利用它awaitTermination
?你可以那样做scheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
。另外,怎么样检查,如果其中任何一个任务得到了其正常完成前取消:if (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
?