2016-07-30 46 views
0

我需要在程序中更新數據,所以我認爲通過使用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方法被聲明。

但是,運行此程序時,即使該任務在單獨的線程上運行,該任務仍是唯一運行的任務。爲什麼它會這樣做,而不是像預期那樣運行?

回答

2

你只是開始一個任務,只用它來在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()); 
     })); 
    } 
} 

如果您發佈更新太頻繁,這也可能導致應用程序無響應。

相關問題