美文网首页
Spring Boot之ThreadPoolTaskExecut

Spring Boot之ThreadPoolTaskExecut

作者: 一生鎻愛 | 来源:发表于2018-09-19 14:52 被阅读0次
    • 初始化线程池
    @Configuration
    @EnableAsync
    public class TaskExecutorConfiguration implements AsyncConfigurer {
    
        @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setKeepAliveSeconds(1000);// 空闲时间
            taskExecutor.setCorePoolSize(5);// 线程池大小
            taskExecutor.setMaxPoolSize(10);// 线程池最大线程数
            taskExecutor.setQueueCapacity(25);// 最大等待任务数
            taskExecutor.initialize();
            return taskExecutor;
        }
    
        @Override
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return null;
        }
    
    }
    
    • corePoolSize 线程池维护线程的最少数量
    • keepAliveSeconds 线程池维护线程所允许的空闲时间
    • maxPoolSize 线程池维护线程的最大数量
    • queueCapacity 线程池所使用的缓冲队列

    当一个任务通过execute(Runnable)方法欲添加到线程池时:

    • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
    • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
    • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
    • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
    • 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
    • 创建异步任务类
    @Slf4j
    @Service("asyncService")
    public class AsyncService {
    
        @Async
        public void executorAsyncTask(String name){
            log.info("执行异步:{}" ,name);
        }
    }
    

    @Slf4j是lombok注解,自动注入log对象

    • 测试类
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootTempleteApplicationTests {
        
        @Autowired
        private AsyncService asyncService;
    
        @Test
        public void testThread() {
            for(int i=0; i < 10;i++) {
                asyncService.executorAsyncTask(i + "");
            }
        }
    }
    
    • 输出

    执行异步:0
    执行异步:5
    执行异步:6
    执行异步:7
    执行异步:8
    执行异步:9
    执行异步:3
    执行异步:2
    执行异步:4
    执行异步:1

    参考文章

    相关文章

      网友评论

          本文标题:Spring Boot之ThreadPoolTaskExecut

          本文链接:https://www.haomeiwen.com/subject/qqdinftx.html