应用关闭后,虚拟线程仍然不会停止
我使用:
@Configuration
public class AsyncConfig {
@Bean(name = "virtualExecutor")
public ExecutorService newExecutor() {
return Executors.newThreadPerTaskExecutor(
Thread.ofVirtual()
.name("virtual-", 0)
.factory()
);
}
}
用于创建虚拟线程并运行:
@Autowired
@Qualifier("virtualExecutor")
private ExecutorService virtualExecutor;
public void myFunc(){
virtualExecutor.execute(() -> {
try {
f1();
} catch (Exception e) {
log.error("Failed", e);
}
});
}
以及:
private f1(){
for(...){
if (Thread.currentThread().isInterrupted()) {
return false;
}
// my code
}
}
应用程序关闭后,线程仍在运行。
我正在使用以下代码来处理终止:
@Component
public class ExecutorShutdownHandler {
private final ExecutorService executor;
public ExecutorShutdownHandler(@Qualifier("virtualExecutor") ExecutorService executor) {
this.executor = executor;
}
@PreDestroy
public void shutdown() {
executor.shutdownNow();
}
有什么解决办法吗?我的代码通过 new ProcessBuilder() 使用Python脚本来进行API调用。
解决方案
来自 igor-zh 的回答,以及 Slaw 的评论,帮助我审视了控制流:
问题出在我处理 Thread.Sleep() 的方式上:
try {
Thread.sleep(time);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
Thread.currentThread().interrupt();
}
捕获并设置中断标志没有触发
if (Thread.currentThread().isInterrupted()) return false;
在下一次迭代中。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。