future工具封装

91 阅读1分钟

future异步封装

说明: 我们一般使用 CompletableFuture+线程池 来进行实现异步任务,但是一般用于一些get()方法,过于单一,我们希望对此进行一些扩展,比如遇到超时或者执行报错的情况,就需要将原始数据返回,这些方面就需要对此进行封装!

工具类: CompletableFutureUtils

作用: 功能仅仅用于超时的时候返回默认值即可!

注意: 此处需要传入Logger是因为如果用CompletableFutureUtils的log来打印,那么其log信息全是这个工具类的了,我们就无法分清日志是具体哪个业务执行产生的;所以选择自行传入Logger,当要打印日志时候就进行使用,日志中变化携带调用类的信息,我们便一目了然!

public class CompletableFutureUtils {

    public static <T> T getResult(Future<T> future, //具体执行方法函数
                                  Long timeOut, //超时时间
                                  TimeUnit timeUnit,
                                  T defaultValue, //默认值
                                  Logger logger //日志对象
    ) {
        try {
            return future.get(timeOut, timeUnit);
        } catch (Exception e) {
            logger.debug("CompletableFutureUtils.getResult.error:{}", e.getMessage(), e);
            return defaultValue;
        }
    }
}

测试

说明: 创建两个FutureTask,一个演示不超时,一个演示超时!

    @Test
    public void Test() {
        List<FutureTask<String>> futureTaskList = new ArrayList<>();
        FutureTask<String> futureTask1 = new FutureTask<>(() -> "ssm");

        mailThreadPool.submit(futureTask1); //submit提交任务,底层包含了execut执行
        String result = CompletableFutureUtils.getResult(futureTask1, 1L, TimeUnit.SECONDS, "默认值", log);
        System.out.println(result);

        FutureTask<String> futureTask2 = new FutureTask<>(() -> {
            Thread.sleep(2000L); //模拟超时
            return "ssy";
        });
        mailThreadPool.submit(futureTask2);
        String result1 = CompletableFutureUtils.getResult(futureTask2, 1L, TimeUnit.SECONDS, "默认值", log);
        System.out.println(result1);
    }
}