直接上代碼:
public class TaskUtil { /** * 多次嘗試執行任務,直到成功或次數用完 * @param task 任務 * @param times 循環次數 * @param millisecond 兩個任務之間休眠時間(單位:毫秒) * @param <T> * @return */ public static <T> T foreachTask(Supplier<T> task, int times, long millisecond){ T rs = null; for (int i = 0; i < times; i++){ rs = task.get(); if(rs instanceof String){ //成功,則中斷循環 if(!StringUtils.isEmpty(rs)){ break; } }else { //成功,則中斷循環 if(rs != null){ break; } } //不是最后一次 - 需要睡眠 if(i != times - 1){ try { Thread.sleep(millisecond); } catch (InterruptedException e) { e.printStackTrace(); } } } return rs; } }
調用示例:
String rs = TaskUtil.foreachTask(() -> { // TODO: 2021/4/29 //失敗要歸還 null 或 "" //return null; return "success" }, 3, 1000);