我的程序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();
});
有没有比每按一次按钮产生一个新线程更好的方法呢?我认为在这种情况下,无论哪种方式都不重要,但如果可能的话,我想在这里做更好的事情。
答案 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结果,允许您添加侦听器并进行任何进一步处理。