直接上代碼:
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);
