话不多说,直接上代码:
FutureUtil.java
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
/**
* <p> @Title FutureUtil
* <p> @Description 异步执行工具类
*
* @author ACGkaka
* @date 2021/5/12 13:34
*/
@Slf4j
public class FutureUtil {
/**
* 创建两倍于系统线程数大小的线程池
*/
private static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
/**
* 限时异步执行
*
* @param time 时间数,例:60
* @param timeUnit 时间单位,例:TimeUnit.SECONDS
*/
public static <T> Object synchronizeExecute(long time, TimeUnit timeUnit, Callable<T> callable) {
Future future = executorService.submit(callable);
try {
return future.get(time, timeUnit);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
future.cancel(true);
log.error("任务超时。。。");
return null;
}
}
public static void main(String[] args) {
log.info("开始执行。。。");
FutureUtil.synchronizeExecute(2, TimeUnit.SECONDS, () -> {
TimeUnit.SECONDS.sleep(10);
return null;
});
log.info("任务结束。。。");
executorService.shutdown();
}
}
执行结果: