springboot--多线程java

本文介绍了如何在SpringBoot应用中使用TaskExecutor的子类ThreadPoolTaskExecutor来实现多线程。通过开启@EnableAsync注解,可以在方法上添加@Async来声明异步任务。示例中详细配置了线程池参数,并展示了Service和Controller的实现,以执行并发的异步任务。
摘要由CSDN通过智能技术生成

springboot实现多线程

1.实现方式
Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor来创建一个基于线城池的TaskExecutor。在使用线程池的大多数情况下都是异步非阻塞的。我们配置注解@EnableAsync可以开启异步任务。然后在实际执行的方法上配置注解@Async上声明是异步任务。

2.样例
创建线程配置类

/**
 * 线程配置类
 */
@Configuration
@EnableAsync
public class ThreadTestConfig implements AsyncConfigurer {

    /**
     *  ThreadPoolTaskExecutor的处理流程
     *  当池子大小小于corePoolSize,就新建线程,并处理请求
     *  当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
     *  当workQueue放不下任务时,就新建线程放入线程池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
     *  当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
     * @return
     */
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor tp = new ThreadPoolTaskExecutor();
        //设置核心线程数
        tp.setCorePoolSize(10);
        //设置最大线程数
        tp.setMaxPoolSize(100);
        //线程使用的缓冲队列
        tp.setQueueCapacity(10);
        //设置程序关闭时要等待线程全部执行完
        tp.setWaitForTasksToCompleteOnShutdown(true);
        //设置等待时间,超过等待时间后立即停止
        tp.setAwaitTerminationSeconds(60);
        //线程名称前缀
        tp.setThreadNamePrefix("Test-Async-");
        //初始化线程
        tp.initialize();
        return tp;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

        return null;
    }
}



编写Service

public interface ThreadTestService {
    void executeThread(int i);
}


实现Service

@Service
public class ThreadTestServiceImpl implements ThreadTestService {
    @Override
    @Async
    public void executeThread(int i) {
        System.out.println("线程"+Thread.currentThread().getName()+"执行异步任务"+i);
    }
}


编写controller

@RestController
public class ThreadTestController {
    @Autowired
    private ThreadTestService threadTestService;

    @RequestMapping("test")
    public Object t1() {
        for (int i = 1; i < 100; i++) {
            threadTestService.executeThread(i);
        }
        return "Ok";
    }
}


运行程序,进入前端后查看后端数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值