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
    主线程结束

  • 相关阅读:
    简直不敢相信...
    halcon 保存Region [原创]
    VS2015 下载链接
    C#【数据转换】十进制yte[]相互转换
    C# 复制窗体问题完美解决办法
    TextBox 保持固定长度,添加新行滚动到最后,跨线程。
    mysql isnull
    C#跨线程访问控件[我的记录]
    C# 常用类-IO-ClassExcelExport
    C# 常用类-IO-ClassXML
  • 原文地址:https://www.cnblogs.com/zhangzonghua/p/12878245.html
Copyright © 2011-2022 走看看