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

时间:2018-11-07 09:11:28

标签: 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;

    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(),所以执行器挂起,等待更多任务执行。因为AsyncTask是Java的Executor的包装,所以扩展AsyncTask的类将无法直接访问Executor,因此无法发出shutdown()。我该如何有序地关闭执行器?

1 个答案:

答案 0 :(得分:4)

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

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