gpt4 book ai didi

java - 为什么这个 FutureTask 会导致我的程序永远挂起?

转载 作者:行者123 更新时间:2023-11-29 07:44:25 25 4
gpt4 key购买 nike

我正在学习 Java 并试图了解 FutureTasks 的工作原理。在我的特殊情况下,我试图生成一个线程 (FutureTask) 来执行某些操作。我实际上并不关心它的 react ;我只是想让它异步执行。我已经使用以下测试代码做了很多工作:

public class Main {
public static void main(String[] args) {
ExecutorService exService = Executors.newSingleThreadInstance();
FutureTask<Boolean> asynch = new FutureTask<>(new Callable<Boolean>() {
@Override
public Boolean call() {
try {
// wait for 5 seconds to simulate activity
Thread.sleep(5000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
System.out.println("Complete");
return true;
}
});

System.out.println("Started");
exService.execute(asynch);
}
}

当我运行这段代码时,它向控制台打印“Started”,然后五秒钟后像我预期的那样打印“Complete”。但是......该程序只是无限期挂起。我假设因为 call() 方法已经完成,所以程序会足够聪明,可以在此时退出,但显然它使该线程永远保持 Activity 状态?如何让它运行一次任务然后退出?

最佳答案

执行程序服务正在使用非守护线程,这会阻止 JVM 终止,请在完成后尝试关闭该服务...

    System.out.println("Started");
exService.execute(asynch);
exService.shutdown();
System.out.println("Good night sweet prince...");

这将导致服务等待所有当前正在运行的任务完成,但不会接受任何要添加的新任务...

关于java - 为什么这个 FutureTask 会导致我的程序永远挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27181196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com