spring注解@Async线程池(1)

前言

@Async 隶属spring。使用该注解可以不用写线程相关代码编写,爽。

创建线程:使用ThreadPoolTaskExecutor
默认核心线程数:8
最大线程数:Integet.MAX_VALUE
队列:LinkedBlockingQueue
容量是:Integet.MAX_VALUE
空闲线程保留时间:60s
线程池拒绝策略:AbortPolicy

如果没有特殊要求,任何额外的代码都不需要。具体使用如下

使用实例

1.启动类加入注解@EnableAsync

@SpringBootApplication
@EnableAsync
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class);
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " service started");
    }
}

2.具体使用

@Component
public class AsyncCommand {

    @Async
    public CompletableFuture<String> dataListHandler(List<Integer> dataList) {
        dataList.forEach(rs -> {
            log.info("dataListHandler->{}", rs);
        });
        return CompletableFuture.completedFuture("end");
    }
 }

3.编写调用代码

@RequestMapping("demo")
@RestController
public class HttpDemoController {

    @Resource
    private AsyncCommand asyncCommand;

    @ResponseBody
    @GetMapping(value = "/data/asyncTest")
    public DemoHttpResponse executeAsyncData() {
        try {
            asyncCommand.dataListHandler(Lists.newArrayList(1,2,3));
            return new DemoHttpResponse(true,"success");
        } catch (Exception e) {
            log.error("HttpDemoController.executeAsyncData error->{}", e);
        }
    }

注意事项

如果使用默认配置
最大队列和最大线程数都是Integer.MAX_VALUE. 而创建新线程的条件是队列填满时。
如果核心线程执行过程中碰到长期占用不释放的情况(HTTP长连接等待获取结果),一旦线程数量占满,新的调用就会进入队列,对外表现为未执行。
解决方案:
核心线程数设置大一点,队列长度(容量)设置不易过大,避免出现长期占用线程的代码。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值