前言
@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长连接等待获取结果),一旦线程数量占满,新的调用就会进入队列,对外表现为未执行。
解决方案:
核心线程数设置大一点,队列长度(容量)设置不易过大,避免出现长期占用线程的代码。