Java实现任务超时处理方法

 更新时间:2019年06月28日 09:55:01   作者:不才黄某  
任务超时处理是比较常见的需求,Java中对超时任务的处理有两种方式,在文中给大家详细介绍,本文重点给大家介绍Java实现任务超时处理方法,需要的朋友可以参考下

任务超时处理是比较常见的需求,比如在进行一些比较耗时的操作(如网络请求)或者在占用一些比较宝贵的资源(如数据库连接)时,我们通常需要给这些操作设置一个超时时间,当执行时长超过设置的阈值的时候,就终止操作并回收资源。Java中对超时任务的处理有两种方式:一种是基于异步任务结果的超时获取,一种则是使用延时任务来终止超时操作。下文将详细说明。

一、基于异步任务结果的超时获取

基于异步任务结果的获取通常是跟线程池一起使用的,我们向线程池提交任务时会返回一个Future对象,在调用Future的get方法时,可以设置一个超时时间,如果超过设置的时间任务还没结束,就抛出异常。接下来看代码:

public class FutureDemo {
  static ExecutorService executorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
  public static void main(String[] args) {
    Future<String> future = executorService.submit(new Callable<String>() {
      @Override
      public String call() {
        try {
          TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
          System.out.println("任务被中断。");
        }
        return "OK";
      }
    });
    try {
      String result = future.get(2, TimeUnit.SECONDS);
    } catch (InterruptedException |ExecutionException | TimeoutException e) {
      future.cancel(true);
      System.out.println("任务超时。");
    }finally {
      System.out.println("清理资源。");
    }
  }}

运行代码,输出如下:

二、使用延时任务来终止超时操作

还有一种实现任务超时处理的思路是在提交任务之前先设置一个定时器,这个定时器会在设置的时间间隔之后去取消任务。当然如果任务在规定的时间内完成了,要记得取消定时器。首先来看一下我们的工作线程:

public class RunningTask {
  private volatile boolean isStop;
  public void stop(){
    this.isStop=true;
  }
  public void doing() {
    int i=1;
    while (!isStop){
      try {
        TimeUnit.SECONDS.sleep(1);
      } catch (InterruptedException e) {
      }
    }
    System.out.println("任务被中断。");
  }
}

这个工作线程每隔一秒钟会去检查下isStop变量,因此我们可以通过isStop变量来取消任务。至于取消任务的逻辑我们放在了定时器里面,代码如下:

public class CancelTask implements Runnable {
  private RunningTask runningTask;
  public CancelTask(RunningTask runningTask) {
    this.runningTask = runningTask;
  }
  @Override
  public void run() {
    runningTask.stop();
  }
}

可以看到,该定时器的作用就是在一定的时间之后去中断工作线程的运行。接下来测试一下:

public class ScheduleDemo {
  static ScheduledExecutorService executorService= Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()*2);
  public static void main(String[] args) {
    RunningTask runningTask=new RunningTask();
    ScheduledFuture<?> scheduledFuture = executorService.schedule(new CancelTask(runningTask), 3, TimeUnit.SECONDS);
    runningTask.doing();
    if(!scheduledFuture.isDone()){
      scheduledFuture.cancel(true);
    }
  }
}

运行结果如下:

可以看到,任务在超时之后也可以被取消。

总结

以上所述是小编给大家介绍的Java实现任务超时处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • 关于Idea清除缓存并重启解决的问题

    关于Idea清除缓存并重启解决的问题

    这篇文章主要介绍了关于Idea清除缓存并重启解决的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Spring Security 控制授权的方法

    Spring Security 控制授权的方法

    本篇文章主要介绍了Spring Security 控制授权的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java使用JaCoCo进行代码覆盖率分析的操作指南

    Java使用JaCoCo进行代码覆盖率分析的操作指南

    JaCoCo是一个开源的 Java 代码覆盖率工具,广泛应用于测试过程中,它可以帮助开发者分析测试代码的覆盖情况,在本文中,我们将介绍 JaCoCo 的基本功能、如何集成到 Maven 项目中,以及通过具体案例展示如何生成覆盖率报告,需要的朋友可以参考下
    2025-02-02
  • servlet之session工作原理简介_动力节点Java学院整理

    servlet之session工作原理简介_动力节点Java学院整理

    这篇文章主要介绍了servlet之session工作原理简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • java 抓取网页内容实现代码

    java 抓取网页内容实现代码

    这篇文章主要介绍了java 抓取网页内容实现代码,需要的朋友可以参考下
    2014-02-02
  • Spring中的HandlerMapping执行流程详解

    Spring中的HandlerMapping执行流程详解

    这篇文章主要介绍了Spring中的HandlerMapping执行流程详解,HandlerMapping在Spring MVC框架的jar包下面,他是处理映射器,为用户发送的请求找到合适的Handler Adapter,它将会把请求映射为HandlerExecutionChain对象,需要的朋友可以参考下
    2023-08-08
  • Java CAS操作与Unsafe类详解

    Java CAS操作与Unsafe类详解

    这篇文章主要介绍了Java CAS操作与Unsafe类的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Spring Security 基于URL的权限判断源码解析

    Spring Security 基于URL的权限判断源码解析

    这篇文章主要介绍了Spring Security 基于URL的权限判断问题,我们想要实现自己的基于请求Url的授权只需自定义一个 AccessDecisionManager即可,接下来跟随小编一起看看实现代码吧
    2021-12-12
  • 使用Java实现Redis限流的方法

    使用Java实现Redis限流的方法

    限流的作用是防止某个段时间段内的请求数过多,造成模块因高并发而不可用。这篇文章给大家介绍使用Java实现Redis限流的相关知识,一起看看吧
    2021-09-09
  • java若依框架集成redis缓存详解

    java若依框架集成redis缓存详解

    今天小编就为大家分享一篇关于java若依框架集成redis缓存的实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08

最新评论