美文网首页
枚举类+享元模式的实现。

枚举类+享元模式的实现。

作者: 小胖学编程 | 来源:发表于2021-07-29 14:59 被阅读0次

通过枚举类来维护项目中的线程池信息,每次调用时,并不new对象,而是使用缓存的线程池对象。

代码实现:

@Slf4j
public enum ThreadPoolEnum {

    PRE_SIGN_URL_THREAD_POOL(new ThreadPoolExecutor(10,
            10, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1),
            new NamedThreadFactory("pre-sign"), new ThreadPoolExecutor.CallerRunsPolicy()), "的线程池");


    public static Map<ThreadPoolEnum, ExecutorService> cache = new ConcurrentHashMap<>();


    static {
        //放入缓存
        for (ThreadPoolEnum threadPoolEnum : values()) {
            cache.put(threadPoolEnum, threadPoolEnum.executor);
        }
        cache = Collections.unmodifiableMap(cache);
    }


    private ExecutorService executor;

    private String desc;


    ThreadPoolEnum(ExecutorService executor, String desc) {
        this.executor = executor;
        this.desc = desc;
    }


    /**
     * 获取线程池。
     * 被sw装饰的线程池
     */
    public ExecutorService getExecutor() {
        return SkyWalkingExecutors.getSkyWalkingExecutorService(cache.get(this));
    }

    /**
     * 任务的批量处理,此方法会对异常进行处理,保证输入和输出的数据是有序的。
     *
     * @param sources  源数据
     * @param function 策略方法
     * @param executor 线程池
     * @param <T>      请求数据的泛型
     * @param <R>      响应数据的泛型
     * @return 并发执行的最终结果
     */
    public static  <T, R> List<BatchFutureResult<T, R>> futureAllFunction(List<T> sources,
                                                                  Function<T, R> function,
                                                                  ExecutorService executor) {
        return futureAllFunction(sources, function, null, executor);
    }

    /**
     *
     * 任务的批量处理,此方法会对异常进行处理,保证输入和输出的数据是有序的。
     *
     * @param sources  源数据
     * @param function 策略方法
     * @param timeout  失效时间,为空即不设置
     * @param executor 线程池
     * @param <T>      请求数据的泛型
     * @param <R>      响应数据的泛型
     * @return 并发执行的最终结果
     */
    public static  <T, R> List<BatchFutureResult<T, R>> futureAllFunction(List<T> sources,
                                                                  Function<T, R> function,
                                                                  Long timeout,
                                                                  ExecutorService executor) {
        /**
         * 获取FutureTask任务,并放入到线程池中。
         */
        List<FutureTask<BatchFutureResult<T, R>>> futureTasks = sources.stream().map(t -> {

            FutureTask<BatchFutureResult<T, R>> resultFutureTask = new FutureTask<>(() -> {
                BatchFutureResult<T, R> batchFutureResult = new BatchFutureResult<>();
                R apply = null;
                Integer status = StatusEnum.SUCCESS.getStatus();
                try {
                    apply = function.apply(t);
                } catch (Exception e) {
                    log.error("批量任务异常", e);
                    batchFutureResult.setMessage(ExceptionUtil.getLogErrorMessage(e));
                    status = StatusEnum.ERROR.getStatus();
                }
                batchFutureResult.setSource(t);
                batchFutureResult.setResult(apply);
                batchFutureResult.setStatus(status);
                return batchFutureResult;
            });
            //放入线程池等待处理
            executor.submit(resultFutureTask);
            return resultFutureTask;
        }).collect(Collectors.toList());


        List<BatchFutureResult<T, R>> results = new ArrayList<>();
        //循环获取结果
        for (int i = 0; i < sources.size(); i++) {
            //获取数据
            T source = sources.get(i);
            FutureTask<BatchFutureResult<T, R>> futureTask = futureTasks.get(i);
            //抓取结果
            BatchFutureResult<T, R> batchFutureResult = new BatchFutureResult<>();
            try {
                if (timeout == null) {
                    batchFutureResult = futureTask.get();
                } else {
                    batchFutureResult = futureTask.get(timeout, TimeUnit.MILLISECONDS);
                }
            } catch (Exception e) {
                log.error("", e);
                batchFutureResult.setStatus(StatusEnum.ERROR.getStatus());
                batchFutureResult.setMessage(ExceptionUtil.getLogErrorMessage(e));
                batchFutureResult.setSource(source);
            }
            //放入数据
            results.add(batchFutureResult);
        }
        return results;
    }

}

项目启动后,将枚举维护的线程池对象放入到缓存中,后续调用均在缓存中抓取。

相关文章

  • 枚举类+享元模式的实现。

    通过枚举类来维护项目中的线程池信息,每次调用时,并不new对象,而是使用缓存的线程池对象。 代码实现: 项目启动后...

  • 对象池-享元模式

    享元模式(FlyweightPattern)--实现对象的复用 代码 享元接口或者抽象类 享元实体类 享元工厂类 ...

  • 享元模式

    享元模式本质就是池化思想,让对象实现共用,java 字符串常量池的实现就是享元模式 第一步,建立抽象类 实现抽象类...

  • 享元模式

    享元角色抽象类 享元角色抽象类实现类 享元角色工厂类 场景使用

  • java基础整理01--可变参数、枚举类

    本文总结了java基础的可变参数、自动装箱拆箱以及枚举类的基本内容,并且从自动装箱和拆箱延伸了享元设计模式;而枚举...

  • 结构型模式:12-享元模式

    带外部状态的解决方案 单纯享元模式 在单纯享元模式中,所有的具体享元类都是可以共享的,不存在非共享具体享元类。 复...

  • 结构型-Flyweight

    享元模式原理与实现 享元模式(Flyweight Design Pattern) 所谓“享元”,顾名思义就是被共享...

  • 设计模式之——享元模式

    1 享元模式的定义 享元模式:使用共享对象可有效地支持大量细粒度的对象。享元模式是池技术的重要实现方式。享元模式的...

  • Android设计模式——享元模式(七大结构型)

    1.享元模式介绍 享元模式(Flyweight Pattern)是对象池的一种实现。享元模式用来尽可能减少...

  • 35 Java设计模式系列-享元模式

    1.享元模式介绍 享元模式(Flyweight Pattern)是对象池的一种实现。享元模式用来尽可能减少内存使用...

网友评论

      本文标题:枚举类+享元模式的实现。

      本文链接:https://www.haomeiwen.com/subject/llaxvltx.html