一. 定义线程池
将线程池创建到application启动类中
@SpringBootApplication
@EnableScheduling // 定时任务
public class AskApplication {
private static final Logger logger = LoggerFactory.getLogger(AskApplication.class);
public static void main(String[] args) {
SpringApplication.run(AskApplication.class, args);
logger.info("========================启动完毕========================");
}
// @Bean(initMethod = "init" , destroyMethod = "del")
// public BeanService beanService() {
// return new BeanService();
// }
@Bean
public ThreadPoolExecutor threadPoolExecutor() {
// 创建一个 队列
LinkedBlockingQueue queue = new LinkedBlockingQueue<>(10);
// 核心线程数 最大线程数 非核心线程存活时间 TimeUnit时间单位 Queue超过线程数存储到什么队列中
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(50, 100, 3000L, TimeUnit.SECONDS, queue);
// 设置线程工程,自定义一下
threadPoolExecutor.setThreadFactory(new ThreadFactory() {
@Override
public Thread newThread(@NotNull Runnable r) {
// ThreadFactory工厂 , 可以对 线程任务分发线程,进行一些特定行为:取名称..等
return new Thread(r , "任务class名称:---" + r.getClass().getName());
}
});
// 设置内存饱满处理机制
// hreadPoolExecutor.AbortPolicy() 是一个内部类 , 所以这个new 是创建的 AbortPolicy 对象
threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
// 创建线程池
return threadPoolExecutor;
}
}
二. 使用
- 定义线程池
@Autowired
private ThreadPoolExecutor threadPoolExecutor;
- 使用execute()调用线程
threadPoolExecutor.execute(new InsertRunnable());
- 线程类实现Runable
public class InsertRunnable implements Runnable {
// 线程中的对象需要手动从spring容器中获取
private static final service类 对象名称 = (service类)AppBean.getBean(对象名称);
}
- 手动获取bean对象的工具类
public class AppBean implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* @Override
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) <BR>
* Method name: setApplicationContext <BR>
* Description: please write your description <BR>
* Remark: <BR>
* @param
* @throws BeansException <BR>
*/
@Override
public void setApplicationContext(ApplicationContext appContext) throws BeansException {
applicationContext = appContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name){
return applicationContext.getBean(name);
}
}