Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用Thread.sleep的情况下在java中执行定期检查?_Java_Concurrency_Timer_Cloud - Fatal编程技术网

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

如何在不使用Thread.sleep的情况下在java中执行定期检查?,java,concurrency,timer,cloud,Java,Concurrency,Timer,Cloud,我有一个程序(线程),可以在云上的远程机器上启动任务。我想监控这个任务的进度,如果它超过了一个特定的超时T,那么它将被取消,并添加更多的云资源,任务将重新开始 如何监视执行此任务的线程 示例场景: Timout=1小时,任务在40分钟内完成,因此一切正常终止 Timout=1小时,由于资源不足,任务在55分钟后失败,因此添加了更多资源,任务再次启动 Timout=1小时,任务在1小时后未完成,因此任务将被终止并添加更多资源,然后任务将再次启动 那么,我如何用java实现这种及时的监控呢 您正在查

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

如何监视执行此任务的线程

示例场景:

  • Timout=1小时,任务在40分钟内完成,因此一切正常终止

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

  • Timout=1小时,任务在1小时后未完成,因此任务将被终止并添加更多资源,然后任务将再次启动


  • 那么,我如何用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();
    }否则{…}
    }
    
    我不确定这是否是最简单的方法。通过快速查看该类,我了解到它允许在特定时间运行调度任务,但如何使用它来监控具有超时的任务。请你解释一下。我不确定这是最简单的方法。通过快速查看这个类,我了解到,它允许在特定时间运行调度任务,但如何使用它来监控超时任务。你能再解释一下吗。