gpt4 book ai didi

使用 Executor 的 JavaFX 应用程序在退出时挂起

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

我正在尝试克隆 Android 的 AsyncTask 以在 JavaFX 应用程序中使用。这是我想出的代码:

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

abstract public class AsyncTask<Param, Result>
{
private Param param;
private static Executor executor;

public AsyncTask()
{
if (executor == null)
executor = Executors.newSingleThreadExecutor();
}

protected void onPreExecute()
{

}

protected Result doInBackground(Param param)
{
return null;
}

protected void onPostExecute(Result result)
{

}

final public void execute(Param param)
{
this.param = param;

onPreExecute();

Task t = new Task();
executor.execute(t);
}

private class Task implements Runnable
{
public void run()
{
Result result = doInBackground(param);
onPostExecute(result);
}
}
}

我可以在我的 JavaFX 应用程序中使用这个类,它工作正常,除了一件事:当我关闭主窗口时,JVM 挂起而不是干净地退出。我必须强制退出该应用程序。

我认为问题与执行器有关。因为我没有发出 shutdown(),Executor 挂起等待执行更多任务。因为 AsyncTask 是 Java Executor 的包装器,所以扩展 AsyncTask 的类不能直接访问 Executor,因此不能发出 shutdown()。我怎样才能有序地关闭 Executor?

最佳答案

您需要通过 Application.stop 方法关闭执行器,或者您确保 Executor 的线程不会阻止 JVM 关闭,方法是使用一个守护线程:

if (executor == null) {
executor = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
});
}

关于使用 Executor 的 JavaFX 应用程序在退出时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186395/

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