Spring实现程序启动后开启线程并持续处理数据

@PostConstruct
public void start() {
    handleXXXThreadStart();
}

/**
 * 系统启动后启动线程
 */
private void handleXXXThreadStart() {
    log.info("处理XXX数据线程启动........");

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            int i = 0;
            int maxCount = 100;
            List<DataType> temp = new ArrayList();
            while (runFlag) {
                try {
                    if (queue.isEmpty()) {
                        continue;
                    }

                    if (queue.size() < maxCount) {
                        TimeUnit.SECONDS.sleep(1);
                    }

                    temp.clear();
                    int count = queue.drainTo(temp, maxCount);

                    if (count > 0) {
                        dealData(temp);
                    }
                } catch (Exception e) {
                    log.error("handle XXX error", e);
                } finally {
                    try {
                        TimeUnit.MILLISECONDS.sleep(maxCount);
                    } catch (InterruptedException e) {
                        log.error(e);
                    }
                }
            }
            log.info("XXX-handle-thread stoped... ");
        }
    });
    t.setName("dadata-handle-thread");
    t.start();
}

@PreDestroy
public void stop() {
    log.info("handle-thread stop ......");
    this.runFlag = false;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用ThreadPoolTaskExecutor来实现线程处理批量数据入库的操作。ThreadPoolTaskExecutor是Spring框架提供的一个线程实现类,可以方便地管理线程池的创建和销毁,并提供了一些配置参数来控制线程池的行为。 下面是使用ThreadPoolTaskExecutor实现线程处理批量数据入库的步骤: 1. 首先,需要在项目中引入Spring的依赖,以使用ThreadPoolTaskExecutor类。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> ``` 2. 在代码中创建一个ThreadPoolTaskExecutor对象,并进行相关配置。可以通过在Spring配置文件中配置bean,或者使用Java代码进行配置。以下是一个示例配置: ```java @Configuration @EnableAsync public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); // 设置核心线程数 executor.setMaxPoolSize(20); // 设置最大线程数 executor.setQueueCapacity(100); // 设置队列容量 executor.setThreadNamePrefix("MyThread-"); // 设置线程名前缀 executor.initialize(); // 初始化线程池 return executor; } } ``` 3. 在需要进行批量数据入库的地方,使用@Async注解标记方法,并指定使用的线程池。例如: ```java @Service public class DataBatchService { @Autowired private ThreadPoolTaskExecutor taskExecutor; @Async("taskExecutor") public void processBatchData(List<Data> dataList) { // 批量数据入库的逻辑处理 // ... } } ``` 4. 调用processBatchData方法时,会自动使用线程池中的线程进行处理。例如: ```java @Autowired private DataBatchService dataBatchService; public void batchDataInsert(List<Data> dataList) { dataBatchService.processBatchData(dataList); } ``` 这样就可以利用ThreadPoolTaskExecutor实现线程处理批量数据入库了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值