zoukankan      html  css  js  c++  java
  • 线程池 ThreadPoolTaskExecutor

    1. springboot中配置线程池

        @Bean
        public ThreadPoolTaskExecutor commonThreadPool() {
            ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
            pool.setCorePoolSize(10);//核心连接数
            pool.setMaxPoolSize(50);//最大连接数
            pool.setQueueCapacity(100);//队列最大容量
            pool.setKeepAliveSeconds(3000);//存活时间
            pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//拒绝执行时如何处理
            return pool;
        }

    2. 属性说明

    maxPoolSize  最大线程数

    workQueue(queueCapacity)  等待队列

      当任务到来时,线程池所有线程正忙,将任务加入到workQueue中等待,等待的任务数量不能大于 queueCapacity

    corePoolSize 线程的核心数量 

      当任务到来时,若线程池中的数量还没有达到线程的核心数量,则会创建新的线程来处理任务。

      当任务到来时,若线程池中的数量大于等于核心线程数量且小于最大线程数,则只有workQueue满时才创建新的线程

      当corePoolSize 和 maxPoolSize 相等,不会再创建新的线程,若workQueue 未满,则加入workQueue中等待空闲线程处理

      当corePoolSize 和 maxPoolSize 相等且workQueue已满,则通过handler 所指定的策略来处理任务

    keepAliveSeconds 存活时间

      这个时间是针对超过corePoolSize 的线程,他们执行完任务后不会立即删除,超过keepAliveSeconds 才删除

    threadFactory

      用来创建线程,默认创建的线程拥有相同的优先级 且是非守护线程,同时设置线程名称

      

    3. 调度执行

      3.1 execute方法

        //主线程和子线程独立,如果子线程执行时间长,主线程会先结束
        public void execute() throws Exception{
            ThreadPoolTaskExecutor threadPool = this.getThreadPool();
            for(int i = 0; i < 2; i++) {
                threadPool.execute(() -> {
                    String threadName = Thread.currentThread().getName();
                    try {
                        Thread.sleep(1000);
                        System.out.println(threadName);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            }
            System.out.println("主线程结束");
        }    
        
        
        public ThreadPoolTaskExecutor getThreadPool() {
            ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
            pool.initialize();
            pool.setCorePoolSize(10);//核心连接数
            pool.setMaxPoolSize(50);//最大连接数
            pool.setQueueCapacity(15);//队列最大容量
            pool.setKeepAliveSeconds(3000);//存活时间
            pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//拒绝执行时如何处理
            return pool;
        }

     输出结果

    主线程结束
    ThreadPoolTaskExecutor-2
    ThreadPoolTaskExecutor-1

      3.2 submit方法

        //submit 方法启动线程可以接收返回值,在主线程中如果不操作子线程的返回值,那么主线程和子线程是独立的
        //如果主线程操作子线程的返回值,那么主线程会等待子线程结束才结束
        public void submit() throws Exception{
            ThreadPoolTaskExecutor threadPool = this.getThreadPool();
            List<Future<String>> futures = new ArrayList<>();
            for(int i = 0; i < 2; i++) {
                Future<String> future = threadPool.submit(() -> {
                    String threadName = Thread.currentThread().getName();
                    try {
                        Thread.sleep(1000);
                        System.out.println(threadName);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return threadName;
                });
                futures.add(future);
            }
            
            //如果没有这个循环,主线程和主线程就是独立的
            for(Future<String> future : futures) {
                System.out.println("主线程输出:" + future.get());
            }
            System.out.println("主线程结束");        
        }
        
        public ThreadPoolTaskExecutor getThreadPool() {
            ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
            pool.initialize();
            pool.setCorePoolSize(10);//核心连接数
            pool.setMaxPoolSize(50);//最大连接数
            pool.setQueueCapacity(15);//队列最大容量
            pool.setKeepAliveSeconds(3000);//存活时间
            pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//拒绝执行时如何处理
            return pool;
        }

    输出结果

    ThreadPoolTaskExecutor-1
    ThreadPoolTaskExecutor-2
    主线程输出:ThreadPoolTaskExecutor-1
    主线程输出:ThreadPoolTaskExecutor-2
    主线程结束

  • 相关阅读:
    Android 自定义Adapter中实现startActivityForResult的分析
    上周热点回顾(11.30-12.6)团队
    .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存团队
    上周热点回顾(11.23-11.29)团队
    上周热点回顾(11.16-11.22)团队
    .NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件团队
    .NET跨平台之旅:增加文件日志功能遇到的挫折团队
    .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库团队
    上周热点回顾(11.9-11.15)团队
    上周热点回顾(11.2-11.8)团队
  • 原文地址:https://www.cnblogs.com/zhangzonghua/p/12878245.html
Copyright © 2011-2022 走看看