【为什么使用线程池!!!,有什么好处】
1.减少创建和销毁线程所消耗的时间和减少系统资源的开销,解决资源不足
2.如果不使用线程池,可能会导致消耗完内存或者过度切换的问题
3.快速响应请求,无需等待
4.线程是一种非常稀有的资源,不能无限创建,需要统一管理
一、线程池参数介绍
corePoolSize 核心线程大小:线程池中最小的线程数
maximum Pool Size 线程池最大线程数量
keepAliveTime 空闲线程存活时间
unit 空闲时间单位
workQueue 工作队列
threadFactory 线程工厂
handler 拒绝策略
①CallerRunsPolicy
该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。
②AbortPolicy(默认策略)
该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。
③DiscardPolicy
该策略下,直接丢弃任务,什么都不做。
④DiscardOldestPolicy
该策略下,抛弃最早进入队列的那个任务,然后尝试把这次拒绝的任务放入队列。
二、例子
/**
* @author moxiufeng
* @date 2021/8/16 21:59
*/
@Configuration
public class ThreadPoolConfig {
@Bean("ThreadPool")
public ExecutorService buildExcelThreadPool() {
// 获取cpu数量
int cpuNum = Runtime.getRuntime().availableProcessors();
// 阻塞队列
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1000);
// 给线程命名
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNamePrefix("threadpool-").build();
// 把线程池交给Spring管理
return new ThreadPoolExecutor(cpuNum + 1
, cpuNum + 1
, 1
, TimeUnit.MINUTES
, workQueue
, threadFactory,new ThreadPoolExecutor.CallerRunsPolicy());
}
}
class ThreadTask implements Runnable{
private Map<String,Object> messageMap;
private String userName;
public ThreadTask(Map<String, Object> messageMap, String userName) {
this.messageMap = messageMap;
this.userName = userName;
}
@Override
public void run() {
try{
Thread.sleep(1000L);
System.out.println(Thread.currentThread().getName());
System.out.println("处理业务成功" + this.toString());
}catch (Exception e){
e.printStackTrace();
System.out.println("处理业务失败" + this.toString());
}
}
@Override
public String toString() {
return "\nThreadTask{" +
"messageMap=" + messageMap +
", userName='" + userName + '\'' +
'}';
}
}
@RestController
class Test{
@Autowired
@Qualifier("ThreadPool")
private ExecutorService executorService;
@RequestMapping("/test")
public void test() {
for (int i = 0; i < 10; i++) {
HashMap<String, Object> map = new HashMap<>();
map.put("message","string....");
ThreadTask threadTask = new ThreadTask(map,"user");
executorService.execute(threadTask);
}
}
}
----------四核
threadpool-0
threadpool-1
threadpool-2
threadpool-3
threadpool-4
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
threadpool-3
threadpool-2
threadpool-0
threadpool-1
threadpool-4
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}
处理业务成功
ThreadTask{messageMap={message=string....}, userName='user'}