JavaFX中的线程:线程是否需要被杀死?

时间:2017-09-29 18:27:57

标签: java multithreading javafx

我正在使用JavaFX编写应用程序,我的理解是,当UI在一个线程中运行时,所有其他非UI操作必须在另一个中运行。到目前为止,我发现的所有示例都是以下内容的变体:

myButton.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent a) {

        // Some UI operations

        new Thread() {
            public void run() {

                // Some non-UI operations

                Platform.runLater(new Runnable() {
                    public void run() {

                        // Some operations to update the UI
                    }
                });
            }
        }.start();
    }
});

我的问题是:你是否需要以某种方式杀死线程以释放其资源?在示例中,我从来没有人似乎使用Thread.join或任何其他类似的方法。

另外,建议像这样使用setDaemon吗?

myButton.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent a) {

        // Some UI operations

        final Thread child = new Thread() {
            public void run() {

                // Some non-UI operations

                Platform.runLater(new Runnable() {
                    public void run() {

                        // Some operations to update the UI
                    }
                });
            }
        };

        child.setDaemon(true);
        child.start();

    }
});

注意: 根据这个线程(JavaFX multithreading - joining threads won't update the UI),不能使用Thread.join,但它似乎没有解决不再需要的线程或者如何杀死它们的问题。

1 个答案:

答案 0 :(得分:0)

当没有安排任何线程时,线程将会老化。但是,依赖于此并不是一个好习惯,因为它可能占用资源。

更好的方法是使用ExecutorService,如the documentation中所述。 ThreadPoolExecutor可以运行一个或多个线程。您可以使用相同的执行程序继续提交可运行的任务,它们将在它管理的线程上执行。该文档提供了有关如何在应用程序结束时关闭执行程序服务的示例。如果您确信没有执行任何未完成的任务,可以发出shutdownNow()以立即清理所有线程。