自定义配置线程参数
pingmoweb:
thread:
core-size: 20
max-size: 200
keep-alive-time: 10
自定义配置类
package com.hdb.pingmoweb.product.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "pingmoweb.thread")
@Data
@Component
public class ThreadPoolConfigProperties {
private Integer coreSize;
private Integer maxSize;
private Integer keepAliveTime;
}
创建注入ThreadPoolExecutor
package com.hdb.pingmoweb.product.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){
return new ThreadPoolExecutor(pool.getCoreSize(), pool.getMaxSize(), pool.getKeepAliveTime(), TimeUnit.SECONDS, new LinkedBlockingQueue(100000), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
}
}
线程编排使用
CompletableFuture使用具体参考:CompletableFuture使用_呆萌很的博客-CSDN博客
package com.hdb.pingmoweb.product.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
@Controller
public class ItemController {
@Autowired
private ThreadPoolExecutor executor;
@GetMapping("/{skuId}.html")
public String skuItem(@PathVariable Long skuId, Model model) throws ExecutionException, InterruptedException {
CompletableFuture<Object> future1 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务1执行...");
return null;
}, executor);
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
System.out.println("任务2执行...");
}, executor);
CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
System.out.println("任务3执行...");
}, executor);
CompletableFuture<Void> future = CompletableFuture.allOf(future1, future2, future3);
future.get(); // 阻塞等待都完成
return "item";
}
}