如何在不使用Thread.sleep的情况下在java中执行定期检查?

时间:2013-07-23 17:42:25

标签: java concurrency timer cloud

我有一个程序(线程),可以在云端的远程计算机上启动任务。我想监视此任务的进度,如果它超过特定的超时T,那么它将被取消,并且将添加更多的云资源,任务将重新开始。

如何监控正在执行此任务的线程?

示例场景:

  1. Timout = 1小时,任务在40分钟内完成,因此一切都应该正常终止。

  2. Timout = 1小时,由于资源不足,55分钟后任务失败,因此添加了更多资源,任务再次启动

  3. Timout = 1小时,任务在1小时后没有完成,因此它被杀死并增加了更多资源,然后再次启动任务。

  4. 那么如何在java中实现及时监控呢?

2 个答案:

答案 0 :(得分:2)

你正在寻找ScheduledThreadPoolExecutor类,它正是这样做的。

答案 1 :(得分:2)

您可以将任务提交给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 {...}
}