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注解实现的线程池就是用的它,我觉得这个可能更加直观且功能丰富,特别当你需要异步处理事件的时候
  • 相关阅读:
    剑气之争,聊聊算法岗位的门户之见!
    80%学生的困惑,学完C/C++之后学什么?
    算法工程师日常,训练的模型翻车了怎么办?
    迭代器设计模式,帮你大幅提升Python性能
    十年编程经验总结,三点技巧帮你提升代码能力!
    CenterNet:Corner-Center三元关键点,检测性能全面提升 | ICCV 2019
    CornerNet:经典keypoint-based方法,通过定位角点进行目标检测 | ECCV2018
    阿里面试:MySQL如何设计索引更高效?
    大厂是怎么进行SQL调优的?
    程序人生|从网瘾少年到微软、BAT、字节offer收割机逆袭之路
  • 原文地址:https://www.cnblogs.com/sky-chen/p/11654903.html
Copyright © 2011-2022 走看看