首页 > 其他分享 >使用TaskDecorator装饰器实现再线程隔离下的数据复制

使用TaskDecorator装饰器实现再线程隔离下的数据复制

时间:2024-08-05 09:30:15浏览次数:14  
标签:隔离 TaskDecorator springframework 线程 org import threadPoolTaskExecutor

自定装饰器

import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;

import java.util.Map;

public class ComTaskDecorator implements TaskDecorator {

    @Override
    public Runnable decorate(Runnable runnable) {
        // 主线程可执行的代码
        Map<String, String> copyOfContextMap = MDC.getCopyOfContextMap();
        return () -> {
            // 子线程执行的代码
            MDC.setContextMap(copyOfContextMap);
            runnable.run();
        };
    }
}

使用自定义的装饰器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;


@Configuration
public class ThreadPoolConfiguration {

    @Bean
    public ThreadPoolTaskExecutor customThreadPoolTaskExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        //核心线程数
        threadPoolTaskExecutor.setCorePoolSize(5);
        //核心线程若处于闲置状态的话,超过一定的时间(KeepAliveTime),就会销毁掉。
        threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
        //最大线程数
        threadPoolTaskExecutor.setMaxPoolSize(10);
        //配置队列大小
        threadPoolTaskExecutor.setQueueCapacity(300);
        //加入装饰器
        threadPoolTaskExecutor.setTaskDecorator(new ComTaskDecorator());
        //配置线程池前缀
        threadPoolTaskExecutor.setThreadNamePrefix("test-log-");
        //拒绝策略:只要线程池未关闭,该策略直接在调用者线程中串行运行被丢弃的任务,显然这样不会真的丢弃任务,但是可能会造成调用者性能急剧下降
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
}

标签:隔离,TaskDecorator,springframework,线程,org,import,threadPoolTaskExecutor
From: https://www.cnblogs.com/shareToAll/p/18342600

相关文章

  • 【Redis】全局命令/内部编码/浅谈单线程模型
    目录前言两个核心命令GET和SET全局命令KEYSEXISTS DELEXPIRETTLTYPE 数据结构的内部编码Redis的5中数据类型Redis数据结构和内部编码单线程架构前言Redis提供了5种数据结构,理解每种数据结构的特点对于Redis开发运维⾮常重要,同时掌握每种数据结构的常......
  • 多线程-进阶2
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库JavaEE专栏:JavaEE关注博主带你了解更多数据结构知识1.CAS1.1CAS全称:Compareandswap比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)......
  • 入门 PyQt6 看过来(基础)23~ 定时器和线程
    一般情况下,应用程序都是单线程运行的,但如果需要执行一个特别耗时的操作,GUI界面其他操作就无法进行,用户感觉程序没有了响应,或者windows系统也认为程序运行出现了问题并自动关闭了程序。有类似的情况应用就需要采用定时器和线程。1定时器(QTimer)如果要在应用程序中周期性地运......
  • JavaEE 第1节 认识多线程
    本节目标(全是重点,都必须掌握)1、了解什么是线程、多线程、进程以及他们之间的关系2、了解多线程的优势以及各种特性3、用Java掌握多种创建线程的方法一、线程、多线程、进程1、概念1.基本概念这三个名词的概念可以用一个餐馆的厨房和厨师来进行超级形象的比喻。想象一下......
  • Linux中的线程3
    死锁在Linux操作系统中,死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因互相持有对方所需的资源而又都在等待对方释放资源,导致它们都无法继续执行下去的一种状态。这种僵局会浪费系统资源,甚至可能导致系统崩溃。案例://线程A和B,以及资源X和Y的初始状态资源X:空闲资......
  • 锁撤销阈值达到20次批量重偏向是针对类还是线程?撤销阈值达到20次触发的20是指撤销偏向
    先说答案, 锁的批量重偏向是针对类的,且只能触发一次,撤销阈值20次是指撤销19个对象偏向锁后再来一个对象需要撤销才会触发锁的批量重偏向,实际会撤销19个。测试过程如下:建立spring项目,要有依赖<dependency><groupId>org.openjdk.jol</groupId>......
  • 进程间通信与线程间通信的方法汇总
    目录一、进程间通信机制管道(pipe):命名管道(FIFO):消息队列(MQ):信号量(semaphore):共享内存(sharedmemory):信号(signal):内存映射(mappedmemory):内存映射和共享内存的区别Socket:二、线程间通信与同步机制Linux平台下:信号(Signal):锁机制:条件变量(ConditionVariable):......
  • Java通过redis实线多线程多用户操作时添加锁
    背景由于项目中多出涉及同步数据,同步过程就是从设备上查询数据,将数据库中该设备数据删除,将新数据导入到数据库;多次同步数据或多用户操作,会导致数据库出现重复数据,例如,两个线程同时删除设备数据,同时导入数据,就会出现双倍数据;还有线程1正在导入数据,中途线程2将线程1导入数据之前删......
  • Java使用多线程池给List赋值导致List存在空的处理
    错误示例:publicList<String>test()throwsNuMaxCloudCommonException{ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);List<String>list=newArrayList<>();for(inti=0;i<3;i++){......
  • 57_2设置Servlet模板、Servlet线程安全问题、跳转
    设置Servlet模板再创建类就有了模板代码#if(${PACKAGE_NAME}&&${PACKAGE_NAME}!="")package${PACKAGE_NAME};#end#parse("FileHeader.java")importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servl......