线程池创建使用

线程池在之间的文章中已经解释

ThreadPoolExecutor (java.util.concurrent.ThreadPoolExecutor):

  • ThreadPoolExecutor 是 Java 标准库中提供的线程池实现类,位于 java.util.concurrent 包下。
  • 使用 ThreadPoolExecutor 可以创建自定义的线程池,具有高度的灵活性,可以通过构造函数传递各种参数,如核心线程数、最大线程数、工作队列类型、拒绝策略等。
  • 提供了丰富的配置选项,但需要手动配置

ThreadPoolTaskExecutor (org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor):

  • ThreadPoolTaskExecutor 是 Spring 框架中提供的线程池实现类,位于 org.springframework.scheduling.concurrent 包下。
  • ThreadPoolTaskExecutor 是对 ThreadPoolExecutor 的封装,提供了更多的配置选项,并且更易于使用。
  • 集成了 Spring 的事务管理和异步任务执行等特性,适用于 Spring 项目

这里采用ThreadPoolTaskExecutor 创建线程池

@Configuration
public class TaskExecutorConfig {

    @Bean("taskExecutor")
    public TaskExecutor getAsyncExecutor(){

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数,线程池创建时初始化线程数
        executor.setCorePoolSize(9);
        // 设置最大线程数,只有缓冲队列满了以后,才会申请超出核心线程数的线程
        executor.setMaxPoolSize(10);
        // 设置队列容量 缓冲队列
        executor.setQueueCapacity(200);
        // 设置线程活跃时间(秒) ,当超过了核心线程之外的线程,在空闲时间到达之后就会被销毁
        executor.setKeepAliveSeconds(60);
        //该方法用来设置线程池关闭的时候等待所有任务都完成后,在继续销毁其他的bean,这样这些异步任务销毁就会先于数据库连接池对象的销毁
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 设置拒绝策略,采用CallerRunsPolicy策略,当线程池没有处理能力的时候,
        // 该策略会直接在executor方法的调用线程中运行被拒绝的任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //该方法用来设置线程池中,任务的等待时间,如果超过这个时间还没有被销毁就 强制销毁,
        //以确保应用最后能够被关闭,而不是阻塞
        executor.setAwaitTerminationSeconds(60);
        return executor;

    }
}

 线程的调用

public class CountDownLatchExample {

    @Resource
    private TaskExecutor taskExecutor;

    public static void main(String[] args) {

        int numThreads = 3;
        CountDownLatch latch = new CountDownLatch(numThreads);

        for (int i = 0; i < numThreads; i++) {
           taskExecutor.excute(() -> {
                // Simulate some task
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // Task completed, countdown the latch
                latch.countDown();
            }).start();
        }

        try {
            latch.await(); // Main thread waits for all tasks to complete
            System.out.println("All tasks completed!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

CountDownLatch 是一种同步工具,用于在多线程环境中协调线程的执行顺序。它允许一个或多个线程等待其他线程完成操作。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值