Spring Boot ThreadPoolTaskExecutor使用

导读:本篇文章讲解 Spring Boot ThreadPoolTaskExecutor使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

  • 初始化线程池
@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 + "");
        }
    }
}

方式二


@Service
public class Test{
   @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
 threadPoolTaskExecutor.submit(() -> {
                dosomething();
            }).get();
        } catch (InterruptedException | ExecutionException e) {
            throw e;
        }
}

 

  • 输出

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14090.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!