【问题标题】:Listen to background thread from UI JavaFX从 UI JavaFX 监听后台线程
【发布时间】:2015-05-17 20:29:52
【问题描述】:

我有一个问题。我正在为桌面创建 JavaFX 应用程序。我的应用程序中有线程在后台运行,我们假设它正在从互联网下载文件。
我已阅读有关 JavaFX 中的并发性的文章。有特殊的类任务。我已经用 Task 扩展了我的课程。但它只能返回一些值,然后它将关闭。
但是我需要在整个应用程序生命周期内运行此任务,并且当下载例如文件时,它应该将结果发布到 UI 线程,更准确地说是在控制器上更新一些 ui 组件。
我知道 Task 有 updateProgress 方法,也许我不仅可以绑定它来接收整数,还可以绑定复杂的对象。
或者在我的情况下还有其他好的方法可以遵循。
请帮忙解决这个问题。

【问题讨论】:

  • 有什么特殊原因让任务在整个应用程序生命周期中运行而不是在需要时创建它?
  • @ItachiUchiha 问题的答案取决于是否从 UI 请求文件下载(或后台线程所做的任何事情)(例如单击“下载”按钮),在这种情况下,您可以创建按需任务,或者是否完全独立于 UI 操作。
  • 不,下载文件只是示例,好吧,我会老实说,邮件检查服务会贯穿整个应用程序生命周期
  • ScheduledService 适合您的场景。还有其他方法可以实现它,例如,TimerTask
  • 谢谢,我会尝试,发表你的评论作为答案

标签: java multithreading concurrency javafx javafx-2


【解决方案1】:

JavaFX 为您提供ScheduledService,可以安排重复工作。 javadoc 说,

ScheduledService 是一个会自动重启的服务 成功执行后自身,并且在某些情况下会 即使在失败的情况下重新启动。

一个非常简单的例子是:

ScheduledService<Object> service = new ScheduledService<Object>() {
     protected Task<Object> createTask() {
         return new Task<Object>() {
             protected Object call() {
                 // Connect to a Server
                 // Download the object
                 updateProgress(...);
                 return object; // Useful in case you want to return data, else null
             }
         };
     }
 };
 service.setPeriod(Duration.seconds(10)); //Runs every 10 seconds
 //bind the service progress/message properties
 progressBar.progressProperty().bind(service.progressProperty());

也有非 javafx 的方法来实现这一点,你可以使用:

【讨论】:

  • 顺便说一句,就像魅力一样
【解决方案2】:

这里最简单的方法是使用普通的旧线程:

// create new thread at start, e.g. at the end for Application.start() method
new Thread(new Runnable() {
  public void run() {
      while(true) {
           //load my data 
           // once loaded
           // update UI using 
           Platform.runLater(new Runnable() {
               public void run() {
                   // here goes my update on FX UI thread
               }
           });
           // update is done let's look for more data
      }
  }
}).start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多