线程池的理解与应用

一. 线程池的理解

  单体的线程每次请求频繁的创建,请求过后频繁的销毁,导致线程栈中的资源的大量消耗。

  线程池的出现在于对单体线程的可控性,管理资源的消耗。

二. Async的线程池(加配置)

  使用异步去配置线程池的话,如图

  此时此刻,没有指定Bean的名字,出现一个问题就是启动默认的Async线程池了,并且没有走你自己配置的线程池

    

 走配置的话需要指定Bean名称,让他去覆盖

  

 1  @Bean("taskExecutor")
 2     public AsyncTaskExecutor getAsyncE(){
 3         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 4         executor.setCorePoolSize(coreSize);
 5         executor.setMaxPoolSize(maxSize);
 6         executor.setQueueCapacity(queueSize);
 7         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
 8         executor.setThreadNamePrefix("MyThread-");
 9         return executor;
10     }

打印如图

三. Scheduled(配置)

不需要指定Bean名称,如果不指定池子的大小默认为1

 1  @Bean
 2     public ThreadPoolTaskScheduler getTaskScheduled(){
 3         ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
 4         //配置池子的大小
 5         taskScheduler.setPoolSize(20);
 6         //拒绝策略为 抛出异常
 7         taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
 8         //设置名字
 9         taskScheduler.setThreadNamePrefix("MyScheduled-");
10         return taskScheduler;
11     }

四. 线程池的五种配置

  1. newSingleThreadPoolExecutor
  2. newFixedThreadPoolExecutor
  3. newCachedThreadPoolExecutor
  4. newScheduledThreadPoolExecutor
  5. ThreadPoolExecutor

 底层全是ThreadPoolExecutor,默认策拒绝略都是AbortPolicy,LinkedBlockingQueue=Integer_Max_Value

1. newSingleThreadPoolExecutor  -->  coreSize=1,maxSize=1

2. newFixedThreadPoolExecutor  -->   coreSize = maxSize = 固定自己写入 = 5

 

3. newCachedThreadPoolExecutor  -->   coreSize = 0,maxSize = Integer_Max_Value 

 

4. newScheduledThreadPoolExecutor  -->  coreSize 默认为1 ,maxSize = Integer_max_value

 

5. ThreadPoolExecutor

 五. 四种策略

  1. AbortPolicy --> 拒绝直接抛出异常
  2. CallerRunsPolicy  --> 拒绝策略为谁发来的返回给谁自己做
  3. DiscardOrdestPolicy  --> 丢弃最老的任务,排进去新任务
  4. DiscardPolicy  --> 直接丢弃任务

  

 

  

  

原文地址:https://www.cnblogs.com/honour1207/p/14201003.html