1. ホーム
  2. java

[解決済み] JavaFXにおけるPlatform.runLaterとTask

2023-02-09 05:56:47

質問

この件に関していくつか調べてみたのですが、はっきり言ってまだ非常に混乱しています。

どなたか、具体的な例を教えてください。 Task を使う場合と Platform.runLater(Runnable); ? この違いは何ですか?どのような場合にこれらのいずれかを使用するための黄金律があるのでしょうか?

また、私が間違っているならば、これらの2つの"Objects"は、GUIでメインスレッドの内部に別のスレッドを作成する方法(GUIを更新するために使用)ではないのでしょうか。

どのように解決するのですか?

使用方法 Platform.runLater(...) を使うか Task は複雑で大きな操作のために

例 なぜ Platform.runLater(...) を使えないのか?

問題:0から100万までカウントしてUIのプログレスバーを更新するだけのバックグラウンドスレッド。

を使用したコード Platform.runLater(...) :

final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
    @Override public void run() {
    for (int i = 1; i <= 1000000; i++) {
        final int counter = i;
        Platform.runLater(new Runnable() {
            @Override public void run() {
                bar.setProgress(counter / 1000000.0);
            }
        });
    }
}).start();

これはひどいコードの塊で、自然に対する犯罪です(そして、プログラミング全般に対する犯罪でもあります)。 プログラミング一般に対する犯罪です。) まず、見るだけで脳細胞が失われます。 このRunnableの二重ネストを見ているだけで、脳細胞が失われてしまいます。第二に、これは イベント・キューを小さな Runnable でいっぱいにしてしまうことです。 明らかに、私たちはバックグラウンドワーカーを簡単に書くための API が必要でした。 ワーカーを簡単に書くための API が必要でした。

タスクを使ったコード:

Task task = new Task<Void>() {
    @Override public Void call() {
        static final int max = 1000000;
        for (int i = 1; i <= max; i++) {
            updateProgress(i, max);
        }
        return null;
    }
};

ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();

前のコードで示されたような欠陥はありません。

参考文献。 JavaFX 2.0でのワーカースレッディング