- 自定義線程池
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setAllowCoreThreadTimeOut(true);
taskExecutor.setCorePoolSize(2);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
taskExecutor.setThreadFactory(new CustomizableThreadFactory("test--springThread-pool-"));
return taskExecutor;
}
自定義spring只默認(rèn)執(zhí)行ApplicationEvent的執(zhí)行器
@Bean
public SimpleApplicationEventMulticaster applicationEventMulticaster(ConfigurableListableBeanFactory beanFactory,
ThreadPoolTaskExecutor taskExecutor) {
SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster(beanFactory);
multicaster.setTaskExecutor(taskExecutor);
return multicaster;
}
2.原理:
spring啟動(dòng)中刹帕,AbstractApplicationContext#refresh()中舵匾,initApplicationEventMulticaster()會(huì)初始化一個(gè)ApplicationEventMulticaster實(shí)例榔至,如果beanFactory容器中能containLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME )
public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
就是自定義了ApplicationEventMulticaster,那就用這個(gè) ;如果沒(méi)有昧谊,就spring自己new一個(gè)ApplicationEventMulticaster實(shí)例this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);尝偎,并把單例放到容器中重归。
3.執(zhí)行代碼的地方
applicationContext.publishEvent(event)-->abstractApplicationContext.publisEvent(event)--->getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);---->Executor executor = getTaskExecutor();,這個(gè)就是自定義的線程池