为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

天涯尽头无女友 2022-01-06 18:50:33
我正在尝试克隆 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 挂起而不是干净地退出。我必须强制退出该应用程序。我认为问题与 Executor 有关。因为我没有发出shutdown(),Executor 挂起等待更多任务执行。由于 AsyncTask 是 Java Executor 的包装器,因此扩展 AsyncTask 的类将无法直接访问 Executor,因此无法发出 shutdown()。如何有序关闭 Executor?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

您要么需要从Application.stop方法中关闭执行程序,要么确保Executor的线程不会通过使用守护线程来阻止 JVM 关闭:


if (executor == null) {

    executor = Executors.newSingleThreadExecutor(r -> {

        Thread t = new Thread(r);

        t.setDaemon(true);

        return t;

    });

}


查看完整回答
反对 回复 2022-01-06
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信