首页 > 解决方案 > 在 Spring Boot 中分配专用后台线程的最佳方法

问题描述

我需要创建一个专用线程监听DatagramSocket. 老派的方法是在上下文创建期间创建一个:

@Bean
void beanDef() {
   var thread = new Thread(myRunnable);
   thread.setDaemon(true);
   thread.start();
}

更现代的方法是创建一个执行者:

@Bean
Executor() {
   var executor = Executors.newSingleThreadExecutor();
    executor.submit(myRunnable);
}

我应该更喜欢哪一个?

标签: spring-bootthreadpoolexecutor

解决方案


这样的事情将是在 Spring 中启动后台线程的一种现代方式:

@Component
public class MySocketListenerLauncher {

 private ExecutorService executorService;

 @PostConstruct
 public void init() {

  BasicThreadFactory factory = new BasicThreadFactory.Builder()
    .namingPattern("socket-listener-%d").build();

  executorService = Executors.newSingleThreadExecutor(factory);
  executorService.execute(new Runnable() {

   @Override
   public void run() {
    // ... listen to socket ...
   }
  });

  executorService.shutdown();

 }

 @PreDestroy
 public void shutdown() {
  if (executorService != null) {
   executorService.shutdownNow();
  }
 }

}

推荐阅读