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

我正在尝试克隆 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?


天涯尽头无女友
浏览 120回答 1
1回答

POPMUISE

您要么需要从Application.stop方法中关闭执行程序,要么确保Executor的线程不会通过使用守护线程来阻止 JVM 关闭:if (executor == null) {&nbsp; &nbsp; executor = Executors.newSingleThreadExecutor(r -> {&nbsp; &nbsp; &nbsp; &nbsp; Thread t = new Thread(r);&nbsp; &nbsp; &nbsp; &nbsp; t.setDaemon(true);&nbsp; &nbsp; &nbsp; &nbsp; return t;&nbsp; &nbsp; });}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java