spring 多线程 线程池

Spring Framework 提供了一些对于多线程编程的支持,其中包括线程池。线程池是一种实现线程复用的机制,它可以预先创建一定数量的线程,然后把任务交给这些线程来执行,避免了每次都要创建和销毁线程的开销。

在 Spring 中,我们可以使用 TaskExecutor 接口来管理线程池。该接口是一个通用的接口,定义了一个execute()方法,可以用来执行一个任务。

Spring 提供了许多 TaskExecutor 的实现类,其中包括:

  • SyncTaskExecutor:同步执行任务,即不使用线程池,直接在当前线程中执行任务。
  • SimpleAsyncTaskExecutor:使用新线程异步执行任务,但每次执行任务都会创建一个新线程。
  • ThreadPoolTaskExecutor:使用线程池执行任务,支持配置线程池的大小、队列容量、超时时间等参数。
  • ConcurrentTaskExecutor:在给定的 TaskExecutor 中异步执行任务,支持并发执行。
  • ConcurrentTaskScheduler:使用线程池异步执行周期性任务,支持配置线程池的大小、队列容量、超时时间等参数。

下面是一个使用 ThreadPoolTaskExecutor 的例子:

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {
 
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10); // 核心线程池大小
        executor.setMaxPoolSize(20); // 最大线程池大小
        executor.setQueueCapacity(200); // 队列容量
        executor.setKeepAliveSeconds(60); // 线程空闲时间
        executor.setThreadNamePrefix("async-task-"); // 线程名前缀
        executor.initialize();
        return executor;
    }
}
View Code

在这个例子中,我们首先定义了一个AppConfig类,并使用@EnableAsync注解启用 Spring 的异步执行功能。然后,我们实现了AsyncConfigurer接口,并覆盖了其中的getAsyncExecutor()方法,该方法返回一个Executor实例。我们使用ThreadPoolTaskExecutor作为实现类,并对线程池进行了一些配置,例如设置核心线程池大小、最大线程池大小、队列容量、线程空闲时间等。最后,我们返回一个已初始化的线程池实例。

我们可以在需要异步执行的方法中添加@Async注解来启用异步执行,例如:

@Service
public class MyService {
 
    @Async
    public void doSomething() {
        // 异步执行的方法体
    }
}
View Code

 

在这个例子中,我们定义了一个MyService类,并使用@Async注解标记了一个方法。当我们调用该方法时,Spring 会自动把该方法的执行放入线程池中异步执行。

posted @ 2023-03-30 00:07  elegydance  阅读(144)  评论(0编辑  收藏  举报