工作中用的线程池ThreadPoolTaskExecutor使用

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 配置线程池`CommonThreadPoolExecutor`以优化数据库大批量数据存储,利用线程池实现并发执行,减少耗时。借助`CountDownLatch`确保所有子线程执行完毕后主线程才返回结果给前端。线程池中的线程复用,注意在`SecurityContext`中清理上下文。代码中定义了`ThreadPoolTaskExecutor` bean,并使用`ContextCopyingDecorator`保证子线程的安全访问用户信息,同时确保每次任务完成后清理上下文。通过`@Resource`和`@Qualifier`注解注入线程池实例,用以执行异步任务。

1、线程池配置得到bean2、使用线程池
使用的目的是有个往数据库存储大量数据的逻辑太耗时,线程池批量处理减少时间、要保证子线程都存储完再主线程返回给前端。
线程池作用:1、线程池执行的一般不阻塞本线程2、循环中让线程池执行可以让多个线程同时执行减少时间(在此基础上使用CountDownLatch和await可以起到并发执行减少时间同时整个事情做完再返回前端--一句话就是加快执行操作)
线程池里的线程是复用的,上线文注意清理!

@Configuration
public class CommonThreadPoolConfiguration {

@Bean("commonThreadPoolExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

    return executor;
}

static class ContextCopyingDecorator implements TaskDecorator {
    @Nonnull
    @Override
    public Runnable decorate(@Nonnull Runnable runnable) {//为了保证在子线程能获取到用户信息
        SecurityContext securityContext = SecurityContextHolder.getContext();
        return () -> {
            try {
                SecurityContextHolder.setContext(securityContext);
                runnable.run();
            } finally {
                SecurityContextHolder.clearContext();//很重要,线程池里的线程是复用的,上线文注意清理!
            }
        };
    }
}

}

@Resource
@Qualifier("commonThreadPoolExecutor")
private AsyncListenableTaskExecutor executor;

CountDownLatch countDownLatch = new CountDownLatch(rulesRespVOList.size());
下面这个在循环里用因为多个并行
executor.execute(() -> insertDb(rulesResp, groupRespVOS,countDownLatch));
主线程
countDownLatch.await();

目录
相关文章
|
Java Spring
线程池:第四章:ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
线程池:第四章:ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
181 0
线程池:第四章:ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
|
Java
线程池ThreadPoolTaskExecutor配置说明
一般实际开发中经常用到多线程,所以需要使用线程池了,  ThreadPoolTaskExecutor通常通过XML方式配置,或者通过Executors的工厂方法进行配置。  XML方式配置代码如下:交给spring来管理; ...
6258 0
|
4天前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
12 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
5天前
|
数据采集 Java Unix
10-多线程、多进程和线程池编程(2)
10-多线程、多进程和线程池编程
|
5天前
|
安全 Java 调度
10-多线程、多进程和线程池编程(1)
10-多线程、多进程和线程池编程
|
9天前
|
存储 Linux C语言
c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写
本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C++多线程的关键。
|
12天前
|
安全 Java
【极客档案】Java 线程:解锁生命周期的秘密,成为多线程世界的主宰者!
【6月更文挑战第19天】Java多线程编程中,掌握线程生命周期是关键。创建线程可通过继承`Thread`或实现`Runnable`,调用`start()`使线程进入就绪状态。利用`synchronized`保证线程安全,处理阻塞状态,注意资源管理,如使用线程池优化。通过实践与总结,成为多线程编程的专家。
|
12天前
|
Java 开发者
告别单线程时代!Java 多线程入门:选继承 Thread 还是 Runnable?
【6月更文挑战第19天】在Java中,面对多任务需求时,开发者可以选择继承`Thread`或实现`Runnable`接口来创建线程。`Thread`继承直接但限制了单继承,而`Runnable`接口提供多实现的灵活性和资源共享。多线程能提升CPU利用率,适用于并发处理和提高响应速度,如在网络服务器中并发处理请求,增强程序性能。不论是选择哪种方式,都是迈向高效编程的重要一步。
|
12天前
|
Java 开发者
震惊!Java多线程的惊天秘密:你真的会创建线程吗?
【6月更文挑战第19天】Java多线程创建有两种主要方式:继承Thread类和实现Runnable接口。继承Thread限制了多重继承,适合简单场景;实现Runnable接口更灵活,可与其它继承结合,是更常见选择。了解其差异对于高效、健壮的多线程编程至关重要。
|
13天前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
21 3