【发布时间】:2020-03-06 13:11:07
【问题描述】:
我需要某种服务,以 1 秒的间隔同时运行几个任务,持续 1 分钟。
如果其中一项任务失败,我想停止服务以及与它一起运行的每个任务,并显示出现问题的某种指示符,否则,如果一分钟后一切顺利,服务将停止并显示所有指示符进展顺利。
例如,我有两个函数:
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();
关于我应该如何解决这个问题并使事情尽可能通用的任何想法?
【问题讨论】:
-
除了实际问题外,
Math.rand不是内置 API。Runnable的实现必须具有void run定义。在提供的上下文中,task1/2schedule的类型将是ScheduledFuture<?>。转到实际问题,如何使用awaitTermination?你可以用scheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);来做。或者,如何检查是否有任何任务在正常完成之前被取消:if (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();? -
安排任务每分钟重复是没有意义的,但是说,如果“一分钟后一切顺利”,您想停止任务。由于您在任何一种情况下都将停止执行程序,因此安排一个在一分钟后关闭执行程序的任务是微不足道的。期货确实已经表明出了什么问题。你没有说,你想要什么其他类型的指标。
标签: java multithreading java-8 concurrency runnable