Spring Boot ThreadPoolTaskExecutor使用

  • 初始化线程池
@Configuration
@EnableAsync
public class TaskExecutorConfiguration implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setKeepAliveSeconds(1000);// 空闲时间
        taskExecutor.setCorePoolSize(5);// 线程池大小
        taskExecutor.setMaxPoolSize(10);// 线程池最大线程数
        taskExecutor.setQueueCapacity(25);// 最大等待任务数
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }

}
  • corePoolSize 线程池维护线程的最少数量
  • keepAliveSeconds 线程池维护线程所允许的空闲时间
  • maxPoolSize 线程池维护线程的最大数量
  • queueCapacity 线程池所使用的缓冲队列

当一个任务通过execute(Runnable)方法欲添加到线程池时:

  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
  • 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
  • 创建异步任务类
@Slf4j
@Service("asyncService")
public class AsyncService {

    @Async
    public void executorAsyncTask(String name){
        log.info("执行异步:{}" ,name);
    }
}

@Slf4j是lombok注解,自动注入log对象

  • 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTempleteApplicationTests {
    
    @Autowired
    private AsyncService asyncService;

    @Test
    public void testThread() {
        for(int i=0; i < 10;i++) {
            asyncService.executorAsyncTask(i + "");
        }
    }
}

方式二


@Service
public class Test{
   @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
 threadPoolTaskExecutor.submit(() -> {
                dosomething();
            }).get();
        } catch (InterruptedException | ExecutionException e) {
            throw e;
        }
}
  • 输出

执行异步:0
执行异步:5
执行异步:6
执行异步:7
执行异步:8
执行异步:9
执行异步:3
执行异步:2
执行异步:4
执行异步:1

正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
原文地址:https://www.cnblogs.com/candlia/p/11919947.html