JavaFX:在单独的线程中运行任务不允许其他任何运行

问题描述:

我需要在程序中更新数据,所以我认为通过使用JavaFX的Task,我可以让它运行为单独的过程在我的程序中。JavaFX:在单独的线程中运行任务不允许其他任何运行

final Task task = new Task<Void>() { 
    @Override 
    protected Void call() throws Exception { 
     Platform.runLater(() -> { 
      while (true) { 
       itemData.forEach(data -> { 
        System.out.println(data.getId()); 
       }); 
      } 
     }); 
     return null; 
    } 
}; 
Thread thread = new Thread(task); 
thread.setDaemon(true); 
thread.start(); 

这在由Initializable接口提供的initialize方法被声明。

但是,运行此程序时,即使该任务在单独的线程上运行,该任务仍是唯一运行的任务。为什么它会这样做,而不是像预期那样运行?

你只是开始一个任务,只用它来在UI线程上发布长时间运行的任务。 Runnable

() -> { 
    while (true) { 
     itemData.forEach(data -> { 
      System.out.println(data.getId()); 
     }); 
    } 
} 

仍在应用程序线程上运行,将其阻塞。

只应在应用程序线程上完成UI更新。繁重的工作应该在另一个线程上完成。

您应该只在应用程序线程上发布更新。类似这样的:

@Override 
protected Void call() throws Exception { 
    while (true) { 
     try { 
      // add a pause between updates 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
     } 
     Platform.runLater(() -> itemData.forEach(data -> { 
      System.out.println(data.getId()); 
     })); 
    } 
} 

如果您发布更新太频繁,这也可能导致应用程序无响应。