如何使用多线程来完成一个java任务

本文介绍了如何在SpringBoot项目中配置一个异步线程池,并使用CompletableFuture进行并发任务处理。配置了线程池参数,如核心线程数、最大线程数等,同时展示了如何利用CompletableFuture进行任务异步执行和结果收集。
摘要由CSDN通过智能技术生成

定义一个异步线程池配置

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 PoolConfiguration {

    /**
     * SpringBoot内置的多线程支持对应的线程池配置
     * @return 一个线程池对象
     */
    @Bean
    public ThreadPoolTaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //默认线程名称
        executor.setThreadNamePrefix("server-content-operate-");
        //核心线程数
        executor.setCorePoolSize(6);
        //最大线程数
        executor.setMaxPoolSize(20);
        //队列容量
        executor.setQueueCapacity(200);
        //线程活跃时间
        executor.setKeepAliveSeconds(60);
        //拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);

        executor.afterPropertiesSet();
        return executor;
    }
}

使用CompletableFuture

		List<CompletableFuture<Void>> completableFutures = new ArrayList<>(16);
		while (startOffset < endOffset){
			log.info("=============================当前推送的开始偏移量是{}==========================", startOffset);
			List<Long> seqList = historyNewsService.getSeqList(startOffset, size);
/
			List<NewsHistoryPostDTO> newsHistoryPostDTOList = new ArrayList<>();
			CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
				newsDetailService.completeHistoryNews(newsHistoryPostDTOList, seqList);

				for(NewsHistoryPostDTO newsHistoryPostDTO : newsHistoryPostDTOList){
					selectDeleteSystemService.sendHistoryNews(newsHistoryPostDTO);
				}
				return null;
			},taskExecutor);
			completableFutures.add(future);
			CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0]))
					.thenApply(justVoid-> completableFutures.stream()
												  .map(CompletableFuture::join).collect(Collectors.toList()));
			startOffset = seqList.get(seqList.size() - 1);
			redisTemplate.opsForValue().set(REDIS_KEY_OF_HISTORY_POST_OFFSET, String.valueOf(startOffset));
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值