簡體   English   中英

多次調用platform.runlater javafx

[英]Calling platform.runlater multiple times javafx

我對在 javafx 中使用Platform.runLater()有點困惑,因為我得到Platform.runLater()會將可運行參數發送到線程隊列,並按順序執行它以防它被多次調用,以及Platform.runLater()是單個 javafx 線程

在我的 javafx 應用程序中,我需要在所有操作系統中監聽鼠標和鍵盤事件,而不僅僅是在 javafx 應用程序中

目前我正在創建兩個時間軸

所以我正在做類似以下的事情:

class FirstTimeLineWrapperClass implements Runnable {
    public void run() {
      Timeline timeline1 = new Timeline(new KeyFrame(
                Duration.seconds(1),
                ae -> {
                    secondPassed++;
                }));

        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
    }
}

class SecondTimeLineWrapperClass implements Runnable {
    public void run() {
      Timeline timeline2 = new Timeline(new KeyFrame(
                Duration.seconds(1),
                ae -> {
                    secondPassed++;
                }));

        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
    }
}

然后我打電話給:

Platform.runLater(new FirstTimeLineWrapperClass());
Platform.runLater(new SecondTimeLineWrapperClass());

以上有點混亂,但只是為了清楚我的問題,

那么我們可以說可以這樣做嗎,上面的代碼中 go 可能有什么錯誤? 如果Platform.runLater()將在單個 javafx 線程中運行,上述代碼如何同時工作?

正如文檔提到的

警告:正在從 FX 運行時引用正在運行的時間軸。 如果未正確停止,無限時間線可能會導致 memory 泄漏。 所有具有動畫屬性的對象都不會被垃圾收集。

動畫不會創建任何額外的線程,也不會在任何后台線程上運行。

您可以將 FX 應用程序線程視為一個循環,在偽代碼中看起來像這樣(實際細節要復雜得多):

while (applicationIsRunning()) {
    if (anyEventsNeedHandling()) {
        handleEvents();
    }
    processAnyRunnablesFromRunLaterQueue();
    if (timeToUpdateScene()) {
        if (animationsNeedProcessing()) {
            processAnimations();
        }
        updateScene();
    }
}

動畫本質上的工作方式是,正在運行的 animation 在上面描述的主循環知道的某個地方注冊自己。 animation 可以確定是否該做某事 - 例如,在您的Timeline中,關鍵幀每秒執行一次,因此Timeline可以相對容易地報告一個或多個關鍵幀是否需要處理,並且事件處理程序將必要時調用。 沒有具體說明它的實際機制,但這是基本功能。

請注意, play()方法只是啟動 animation(即注冊它以供 FX 應用程序線程循環檢查)並立即退出。 因此,在您的代碼中,您在 FX Application 線程上快速連續地啟動兩個Timeline ,它們將一個接一個地立即啟動(實際上幾乎同時啟動)。

因此,您可以啟動多個動畫,並且它們不會阻塞 FX 應用程序線程。 通常的規則適用於在 FX 應用程序線程上執行的代碼,適用於任何關鍵幀處理程序中的代碼:它不應該阻塞,也不應該花費很長時間來運行。

另請注意,如果您將可運行對象添加到稍后運行隊列的速度快於它們的執行速度,您將有效地阻塞 FX 應用程序線程,從而使 UI 響應能力較差(或完全阻塞它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM