94

私はこれについていくつかの研究を行ってきましたが、控えめに言ってもまだ非常に混乱しています。

Taskいつ使用するか、いつ使用するかについて具体的な例を教えてもらえますPlatform.runLater(Runnable);か?違いは正確には何ですか?これらのいずれかをいつ使用するかについての黄金のルールはありますか?

また、私が間違っている場合は訂正してください。ただし、これら2つの「オブジェクト」は、GUIのメインスレッド内に別のスレッドを作成する方法ではありませんか(GUIの更新に使用されます)。

4

4 に答える 4

117

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();

これは恐ろしいコードの塊であり、自然に対する犯罪です (そしてプログラミング全般)。まず、Runnables のこの二重の入れ子を見るだけで、脳細胞が失われます。第 2 に、Runnables がほとんどなく、実際には 100 万個の Runnables がイベント キューを圧倒します。明らかに、UI とやり取りするバックグラウンド ワーカーを簡単に記述できるようにするための API が必要でした。

Task を使用したコード:

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 でのワーカー スレッディング

于 2012-12-09T23:15:13.823 に答える
64
  • Platform.runLater: 非 GUI スレッドから GUI コンポーネントを更新する必要がある場合は、それを使用して更新をキューに入れることができ、GUI スレッドによってできるだけ早く処理されます。
  • TaskWorker(アプリケーションのフリーズを避けるために) GUI スレッドの外部で長いタスクを実行する必要があるが、ある段階で GUI と対話する必要がある場合に使用されるインターフェースを実装します。

Swing に精通している場合、前者は に相当しSwingUtilities.invokeLater、後者は の概念に相当しSwingWorkerます。

Taskのjavadoc には、それらの使用方法を明確にする多くの例が示されています。並行性に関するチュートリアルも参照できます。

于 2012-12-09T08:42:45.087 に答える
3

明示的な Platform.runLater() を使用する理由の 1 つは、UI のプロパティをサービス (結果) プロパティにバインドしたことです。したがって、バインドされたサービス プロパティを更新する場合は、runLater() を介してこれを行う必要があります。

JavaFX アプリケーション スレッドとも呼ばれる UI スレッドでは、次のようになります。

...    
listView.itemsProperty().bind(myListService.resultProperty());
...

サービスの実装 (バックグラウンド ワーカー):

...
Platform.runLater(() -> result.add("Element " + finalI));
...
于 2015-07-17T09:39:26.210 に答える