天天看點

java 多線程更新ui_多線程 – Javafx從線程更新UI而無需直接調用Platform.runLater

我認為使用Platform.runLater(…)從背景線程更新UI并不“合适”.有些情況下,這是正确的做法,如

Task Javadocs所示.javafx.concurrent API提供的是一個“更進階”的接口,用于編寫多線程JavaFX應用程式時通常需要的功能.這個包中的類是由具有多線程程式設計專業知識的人編寫的,是以它們很可能已經解釋了普通程式員可能不知道的微妙之處.

作為一個例子,雖然updateMessage最終最終調用Platform.runLater(…)是正确的,但兩者并不完全等效.如果您通過對Platform.runLater(..)的簡單調用嘗試相同的操作:

// Don't do this! It will make the UI unresponsive:

Task task = new Task() {

@Override

protected Object call() throws Exception {

int i = 0;

while (true) {

Platform.runLater(() -> lblStatus.textProperty().set("Count "+i));

i++;

}

return null ;

}

};

Thread t = new Thread(task);

您的使用者界面将變得(至少部分)無響應.原因是你在FX應用程式線程上安排了這麼多Runnables,它沒有時間進行正常工作(渲染UI,響應使用者輸入等). updateMessage(…)的實作是經過精心編寫的,以“限制”對Platform.runLater(…)的調用(它基本上将它們限制為每幀渲染一次).該代碼實作起來有點棘手:在代碼示例中使用javafx.concurrent API意味着您不必自己實作它.

是以,必須始終在FX應用程式線程上對UI進行更改,并且通過Platform.runLater(…)來安排這些更改的方式.實際上,您可以直接調用它,也可以調用最終調用它的代碼.但是,包含對Platform.runLater(…)的調用的一些API方法以非常複雜的方式進行,當這些方法提供您需要的功能時,您應該更喜歡那些自己進行調用的方法.