说明:本文章不在对线程池的优缺点和用途在做说明了,只是简单的用法。
文件分两步:即两个文件。
1.ExecutorConfig.java配置文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author 李庆伟
* @date 2022/10/10 16:28
*/
@Configuration
public class ExecutorConfig {
/**
* 默认线程池线程池
*
* @return Executor
*/
@Bean
public ThreadPoolTaskExecutor defaultThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数目
executor.setCorePoolSize(2);
//指定最大线程数
executor.setMaxPoolSize(8);
//队列中最大的数目
executor.setQueueCapacity(16);
//线程名称前缀
executor.setThreadNamePrefix("server_executor-");
//rejection-policy:当pool已经达到max size的时候,如何处理新任务 //CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行 //对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后的最大存活时间
executor.setKeepAliveSeconds(60);
//加载
executor.initialize();
return executor;
}
}
2.ThreadPoolController.java类【直接控制层搞了】
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author 李庆伟
* @date 2022/11/3 14:58
*/
@RestController
@RequestMapping("/testThreadPool")
public class ThreadPoolController {
@Resource
private ThreadPoolTaskExecutor taskExecutor;
@GetMapping(value = "addOne")
public String addOne() {
//执行线程完成后带返回结果
CompletableFuture<List<String>> infoFuture0 = CompletableFuture.supplyAsync(() -> {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println("线程名称: "+Thread.currentThread().getName());
return list;
}, taskExecutor);
//可以获取到infoFuture0执行的结果,执行线程完成后没有返回结果
CompletableFuture<Void> infoFuture1 = infoFuture0.thenAcceptAsync((res) -> {
System.out.println(res);//打印结果为[1, 2, 3]
}, taskExecutor);
try {
//等待infoFuture0和infoFuture00执行完成
CompletableFuture.allOf(infoFuture0, infoFuture1).get();
} catch (Exception e) {
throw new RuntimeException("Thread Error.........");
}
try {
System.out.println(infoFuture0.get());//打印结果为[1, 2, 3]
System.out.println(infoFuture1.get());//null
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return "ok";
}
@GetMapping(value = "addTwo")
public String addTwo() {
List<String> list = new ArrayList<>();
//执行线程完成后不带返回结果
CompletableFuture<Void> infoFuture0 = CompletableFuture.runAsync(() -> {
list.add("a");
list.add("b");
list.add("c");
System.out.println("线程名称: "+Thread.currentThread().getName());
}, taskExecutor);
//执行线程完成后带返回结果
CompletableFuture<String> infoFuture1 = CompletableFuture.supplyAsync(() -> {
System.out.println("线程名称: "+Thread.currentThread().getName());
return "hehe";
}, taskExecutor);
try {
//等待infoFuture0和infoFuture00执行完成
CompletableFuture.allOf(infoFuture0, infoFuture1).get();
} catch (Exception e) {
throw new RuntimeException("Thread Error.........");
}
try {
System.out.println(infoFuture0.get());//打印结果为null
System.out.println(infoFuture1.get());//打印结果为hehe
System.out.println(list);//打印结果为[a, b, c]
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return "ok";
}
}
到此完成。。。。。。。。。。。。。。