如果我们在@Configuration类中使用@Bean注解创建了一个线程池对象,并指定了该bean的名称,那么我们可以通过该bean的名称将线程池对象注入到其他类中。
例如,在下面的代码中,我们在ThreadPoolConfig类中创建了一个名为"threadPoolTaskExecutor"的线程池对象,并将其注入到MyService类中:
@Configuration
public class ThreadPoolConfig {
@Bean("threadPoolTaskExecutor")
public ExecutorService threadPoolTaskExecutor() {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
4, // 核心线程数
10, // 最大线程数
0L, // 线程池维护线程所允许的空闲时间
TimeUnit.MILLISECONDS, // 线程池维护线程所允许的空闲时间的单位
new LinkedBlockingQueue<>(), // 线程池所使用的缓冲队列
Executors.defaultThreadFactory(),
// 线程池创建线程使用的工厂
new ThreadPoolExecutor.AbortPolicy() // 线程池对拒绝任务的处理策略
);
return executor;
}
}
然后,在MyService类中,我们可以通过@Qualifier注解和bean名称来将线程池对象注入到该类中:
@Service
public class MyService {
@Autowired
@Qualifier("threadPoolTaskExecutor")
private ExecutorService threadPoolTaskExecutor;
public void doSomething() {
threadPoolTaskExecutor.execute(() -> { // 执行异步任务 });
}
}
在上面的代码中,我们使用@Autowired注解将ExecutorService类型的线程池对象注入到MyService类中,并通过@Qualifier注解指定了该bean的名称为"threadPoolTaskExecutor"。这样,在doSomething方法中,我们就可以使用该线程池对象执行异步任务了。