如何在不使用Thread.sleep的情况下在java中执行定期检查?
我有一个程序(线程),可以在云上的远程机器上启动任务。我想监控这个任务的进度,如果它超过了一个特定的超时T,那么它将被取消,并添加更多的云资源,任务将重新开始 如何监视执行此任务的线程 示例场景:如何在不使用Thread.sleep的情况下在java中执行定期检查?,java,concurrency,timer,cloud,Java,Concurrency,Timer,Cloud,我有一个程序(线程),可以在云上的远程机器上启动任务。我想监控这个任务的进度,如果它超过了一个特定的超时T,那么它将被取消,并添加更多的云资源,任务将重新开始 如何监视执行此任务的线程 示例场景: Timout=1小时,任务在40分钟内完成,因此一切正常终止 Timout=1小时,由于资源不足,任务在55分钟后失败,因此添加了更多资源,任务再次启动 Timout=1小时,任务在1小时后未完成,因此任务将被终止并添加更多资源,然后任务将再次启动 那么,我如何用java实现这种及时的监控呢 您正在查
那么,我如何用java实现这种及时的监控呢 您正在查找正是这样做的
ScheduledThreadPoolExecutor
类。您正在查找正是这样做的ScheduledThreadPoolExecutor
类。您可以将任务提交给Executor服务,尝试通过超时获取结果,如果有超时,则取消任务
它可能看起来像:
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<?> future = executor.submit(yourTask);
try {
future.get(1, TimeUnit.HOURS);
} catch (TimeoutException e) {
future.cancel(true);
resubmitWithMoreResources();
} catch (ExecutionException e) {
Throwable underlyingCause = e.getCause();
if (underlyingCause instanceof ResourceException) {
resubmitWithMoreResources();
} else {...}
}
ExecutorService executor=Executors.newFixedThreadPool(1);
Future=executor.submit(您的任务);
试一试{
future.get(1,TimeUnit.HOURS);
}捕获(超时异常e){
future.cancel(true);
重新提交thmoreResources();
}捕获(执行例外){
可丢弃的潜在原因=e.getCause();
if(underlyngcause instanceof ResourceException){
重新提交thmoreResources();
}否则{…}
}
您可以将任务提交给ExecutorService,尝试通过超时获取结果,如果有超时,则取消该任务
它可能看起来像:
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<?> future = executor.submit(yourTask);
try {
future.get(1, TimeUnit.HOURS);
} catch (TimeoutException e) {
future.cancel(true);
resubmitWithMoreResources();
} catch (ExecutionException e) {
Throwable underlyingCause = e.getCause();
if (underlyingCause instanceof ResourceException) {
resubmitWithMoreResources();
} else {...}
}
ExecutorService executor=Executors.newFixedThreadPool(1);
Future=executor.submit(您的任务);
试一试{
future.get(1,TimeUnit.HOURS);
}捕获(超时异常e){
future.cancel(true);
重新提交thmoreResources();
}捕获(执行例外){
可丢弃的潜在原因=e.getCause();
if(underlyngcause instanceof ResourceException){
重新提交thmoreResources();
}否则{…}
}
我不确定这是否是最简单的方法。通过快速查看该类,我了解到它允许在特定时间运行调度任务,但如何使用它来监控具有超时的任务。请你解释一下。我不确定这是最简单的方法。通过快速查看这个类,我了解到,它允许在特定时间运行调度任务,但如何使用它来监控超时任务。你能再解释一下吗。