原文: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()); } }