产生新线程以运行简单后台任务的替代方法?

时间:2018-01-21 21:05:29

标签: java javafx

我的程序UI中有一个按钮,它调用一个需要花费很多时间才能执行的功能。 (示例中为toggleLoveTrack())。

如果我将该调用直接放在JavaFX线程上,GUI将冻结,直到执行完成。

所以另一种方法是将任务放在一个单独的后台线程中,执行该任务,然后在长执行函数完成后使用Platform.runLater()更新UI,如下所示:

loveButton.setOnAction( ( ActionEvent e ) -> {
    Thread taskThread = new Thread (() -> {
        audioSystem.getLastFM().toggleLoveTrack( audioSystem.getCurrentTrack() );
        Platform.runLater( () -> updateLovedIndicator() );
    });
    taskThread.setDaemon( true );
    taskThread.start();
});

有没有比每按一次按钮产生一个新线程更好的方法呢?我认为在这种情况下,无论哪种方式都不重要,但如果可能的话,我想在这里做更好的事情。

1 个答案:

答案 0 :(得分:2)

您不应该为每个任务生成新线程。只需创建executor service,将其存储为字段,然后将每个任务提交为runnable

// replace this with a thread pool executor or whatever
private ExecutorService executor = Executors.newSingleThreadExecutor();

然后,在你的方法中:

executor.execute(() -> /* your code here */);

更好的是,您可以使用CompletableFuture.runAsync()而不关心执行程序(除非您提供显式执行程序,否则任务将提交到公共fork / join池)。这样,您将获得completable future结果,允许您添加侦听器并进行任何进一步处理。