spring-boot - 在 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 中启动后台线程的一种现代方式:
@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();
}
}
}
推荐阅读
- java - 错误:运行 .jar 文件时出现 java.lang.NoClassDefFoundError
- javascript - Gulp 错误:以下任务未完成:默认、sass
- java - openapi-generator 不使用 Spring Webclient 为 Java 客户端生成响应标头
- php - 页面404找不到laravel 8
- docker - 无法创建通道 HyperLedger Fabric v2.3
- pandas - 在 Pandas 中合并来自 groupby() 的计数组合
- google-cloud-platform - Google Cloud Workflow - 获取不记名令牌步骤
- c# - 强制 JSON.NET 在序列化 DateTime 时包含毫秒并为空日期字段输出 null
- postgresql - 需要 Grafana“自定义所有值”来查询 Postgres 中的所有值
- image-processing - 什么过程会产生这种乱七八糟的块状文本?