线程池 ThreadPoolTaskExecutor

Posted zhangzonghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池 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
主线程结束

 

以上是关于线程池 ThreadPoolTaskExecutor的主要内容,如果未能解决你的问题,请参考以下文章

自己实现一个简单的线程池

什么叫线程池?线程池如何使用?

多线程(六):线程池

多线程(六):线程池

十五、线程池(六)自动创建线程池的弊端

java 如何获得线程池中正在执行的线程数?