Java程序执行超时

hutool类可以直接用.timeout(毫秒)

例如:

String result2 = HttpRequest.post(url) 
.header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
.form(paramMap)//入参内容
.timeout(20000)//超时,毫秒
.execute()
.body();

hutool官网地址: https://www.hutool.cn/docs/#/http/Http请求-HttpRequest

我这里用到的是Future接口与ExecutorService类:

为什么会用到:        在日常开发中,总是要和第三方对接,有的时候会出现接口调用超时的情况,我们可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。

怎么去理解:        就相当于我在店铺预定了一样东西,一段时间后我可以拿着订货单来提货,这期间我可以去做别的任何事情。其中Future接口就是订货单,真正处理此订单的是Executor类,它根据Future接口的要求来生产产品。

接口介绍:

Future接口是一个泛型接口,严格的格式应该是Future<V>,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

  1. boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
  2. boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
  3. boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
  4. get () throws InterruptedException, ExecutionException  等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
  5. get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException

示例:

 Future的实现类有java.util.concurrent.FutureTask<V>即 javax.swing.SwingWorker<T,V>。通常使用FutureTask来处理我们的任务。  

    FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:

public boolean syncProcessStatus(String paramStr) {
    String returnStr = "-1";
    final ExecutorService exec = Executors.newSingleThreadExecutor();
    Callable<String> call = new Callable<String>() {
        public String call() throws Exception {
            String res = HttpRequest.post("url")
                    .header("Content-Type", "application/json")
                    .body(paramStr)
                    .execute().body();
            logger.info("归档节点同步流程状态接口结果:" + res);
            JSONObject resJson = JSONObject.parseObject(res);
            return resJson.getInteger("errno").toString();
        }
    };
    // Future是一个接口,该接口用来返回异步的结果
    Future<String> future = exec.submit(call);
    try {
        // 同步结果,并且设置超时时间
        returnStr = future.get(5000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        //接口超时  执行其他操作
        insertRebackRecord(5, paramStr);
        e.printStackTrace();
    }
    //执行结束后,手动关闭线程池
    exec.shutdown();
    return ("0").equals(returnStr);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹帅军是渣娃程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值