zoukankan      html  css  js  c++  java
  • ThreadPoolTaskExecutor学习

    1. ThreadPoolTaskExecutor学习

    1.1. 前言

    • 我们知道一般创建线程池,我们都用ThreadPoolExecutor,但实际上Spring它也对该线程池做了一层封装,他就是ThreadPoolTaskExecutor

    1.2. 代码例子

    • 它的创建方式也很简单,各个属性直接通过set设置属性值,最后调用initialize()方法初始化,实际去做的就是初始化ThreadPoolExecutor
    • 它封装了回调监听方法ListenableFutureCallback,可以用作异步回调处理
    /**
     * @author laoliangliang
     * @date 2019/10/10 10:10
     */
    public class ExecutorDemo {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(1);
            executor.setMaxPoolSize(5);
            executor.setQueueCapacity(1);
            executor.setBeanName("mybean");
            executor.setThreadNamePrefix("mytask-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
            executor.initialize();
    
            List<FutureTask<String>> result = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                FutureTask<String> futureTask = new FutureTask<>(() -> {
                    System.out.println("hello world!");
                    Thread.sleep(200);
                    return "hello "+Thread.currentThread().getName();
                });
                executor.submit(futureTask);
                result.add(futureTask);
            }
            for (FutureTask<String> futureTask : result) {
                try {
                    System.out.println(futureTask.get());
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            }
    
            ListenableFuture<?> runnable = executor.submitListenable(() -> {
                Thread.sleep(1000);
                System.out.println("runnable");
                return "runnable result";
            });
            runnable.addCallback(new ListenableFutureCallback<Object>() {
                @Override
                public void onFailure(Throwable e) {
                  e.printStackTrace();
                }
    
                @Override
                public void onSuccess(Object o) {
                    System.out.println("success "+o.toString());
                }
            });
    
            System.out.println(runnable.get());
            executor.shutdown();
        }
    }
    

    结果

    [INFO] ThreadPoolTaskExecutor - -Initializing ExecutorService  'mybean'
    hello world!
    hello world!
    hello world!
    hello world!
    hello mytask-1
    hello world!
    hello mytask-1
    hello mytask-2
    hello mytask-3
    hello mytask-4
    runnable
    runnable result
    [INFO] ThreadPoolTaskExecutor - -Shutting down ExecutorService 'mybean'
    success runnable result
    

    1.3. 总结

    • 当使用线程池时,可以考虑直接使用spring封装的线程池,前一篇@Async注解实现的线程池就是用的它,我觉得这个可能更加直观且功能丰富,特别当你需要异步处理事件的时候
  • 相关阅读:
    关于Excel无法打开,因为文件格式或文件扩展名无效的解决方法
    SpringBoot整合rabbitmq
    异步线程池的使用
    java1.8新特性之stream流式算法
    hashMap的底层实现
    redis底层设计(五)——内部运作机制
    redis底层设计(四)——功能的实现
    redis底层设计(三)——redis数据类型
    redis底层设计(二)——内存映射数据结构
    redis底层设计(一)——内部数据结构
  • 原文地址:https://www.cnblogs.com/sky-chen/p/11654903.html
Copyright © 2011-2022 走看看