原文:https://www.jianshu.com/p/326465500d1c?utm_campaign
使用场景
之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果在请求进入熔断器开始计时,并且接口在超时时间内没有响应,则需要提早中断该请求并返回。
比如正常下游接口的超时时间为800ms,但是因为自身业务的特殊需求,最多只能等200ms,如果200ms之内没有数据返回,则返回降级数据。这里处理请求的线程可以看成是tomcat线程池中的一个线程,如果通过线程池返回的Future,可以很轻松的实现超时返回。
超过自己的预设值,直接返回失败,并且记录一下失败日志,可以自己决定是否需要重试。
主要方法
因为需要有返回值,但是实现 Runable ,重写 run 方法没有返回值,
所以我们采用实现Callable的方式,重写 call 方法就行
如何得到返回值呢?
task.get()
注意的是,默认不设置时间,这个是无限等待堵塞在那里的。
所以还提供了另外的方法
task.get(2500, TimeUnit.MILLISECONDS);
加个参数表示超时时间。
作者:lucode
链接:https://www.jianshu.com/p/326465500d1c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
public class CallableDemo { public static String fun() { // 成员内部类 class CallableThread implements Callable<String> { @Override public String call() { try { // 假设这个是一个耗时的网络 请求 Thread.sleep(6000); return "请求返回值"; } catch (InterruptedException e) { // 假装记录一下日志 return null; } } } // 开始事件 long beginTime = System.currentTimeMillis(); Callable<String> callableThread=new CallableThread(); FutureTask<String> task= new FutureTask<>(callableThread); // 开启线程 new Thread(task).start(); String result; try { // 如果2.5秒没有返回值就 抛出异常 result = task.get(2500, TimeUnit.MILLISECONDS); } catch (Exception e) { result=null; } // 结束事件 long endTime = System.currentTimeMillis(); System.out.println("cast : " + (endTime - beginTime) / 1000 + " second!"); if (result!=null){ return result; }else { return null; } } public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println(fun()); } }