应用关闭后,虚拟线程仍然不会停止

后端开发 2026-07-09

我使用:

@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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章