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

使用Executor挂起退出的JavaFX应用程序,java,javafx,android-asynctask,executorservice,java.util.concurrent,Java,Javafx,Android Asynctask,Executorservice,Java.util.concurrent,我正在尝试复制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;

我正在尝试复制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挂起,而不是干净地退出。我必须强制退出应用程序


我认为问题与遗嘱执行人有关。因为我没有发出关机命令,所以执行器挂起,等待更多任务执行。因为AsyncTask是Java的执行器的包装器,所以扩展AsyncTask的类将无法直接访问执行器,因此无法发出关闭命令。如何有序关闭执行器?

您需要从Application.stop方法关闭执行器,或者确保执行器的线程不会使用守护进程线程阻止JVM关闭:

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

您需要从Application.stop方法关闭执行器,或者使用守护进程线程确保执行器的线程不会阻止JVM关闭:

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

我使用了setDaemon技术。工作得很有魅力!非常感谢!我使用了setDaemon技术。工作得很有魅力!非常感谢!