使用 Executor 的 JavaFX 应用程序在退出时挂起
JavaFX app that uses Executor hangs on quit
我正在尝试制作 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 应用程序中使用这个 class,它工作正常,除了一件事:当我关闭主要 window 时,JVM 挂起而不是干净地退出.我必须强制退出应用程序。
我认为问题与执行器有关。因为我没有发出 shutdown(),Executor 挂起等待执行更多任务。因为 AsyncTask 是 Java 的执行器的包装器,所以扩展 AsyncTask 的 class 不能直接访问执行器,因此不能发出 shutdown()。如何有序关闭执行器?
您需要通过 Application.stop
方法关闭执行程序,或者确保 Executor
的线程不会通过使用守护线程来阻止 JVM 关闭:
if (executor == null) {
executor = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
});
}
我正在尝试制作 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 应用程序中使用这个 class,它工作正常,除了一件事:当我关闭主要 window 时,JVM 挂起而不是干净地退出.我必须强制退出应用程序。
我认为问题与执行器有关。因为我没有发出 shutdown(),Executor 挂起等待执行更多任务。因为 AsyncTask 是 Java 的执行器的包装器,所以扩展 AsyncTask 的 class 不能直接访问执行器,因此不能发出 shutdown()。如何有序关闭执行器?
您需要通过 Application.stop
方法关闭执行程序,或者确保 Executor
的线程不会通过使用守护线程来阻止 JVM 关闭:
if (executor == null) {
executor = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
});
}