重いコンピューティングを行う複数のスレッドを実行するJavaFXアプリケーションがあります。多くのスレッドをPlatform.runLater()で使用してフリーズするJavaFX UI
mainThread = new MainThread(mc);
mainThread.start();
:問題はしばらくUIが完全にフリーズした後、私は唯一のスレッドの残りの部分を生成します、私は私のメインスレッドを開始する方法をPlatform.runLater()
でUIを更新することですここでスレッドにメインコントローラへの参照を渡します。このコントローラはこの参照をスレッドの残りの部分に渡し、TextAreaに印刷することができます。
メインスレッドが一度にのみ2つのサブスレッドを生成し、これらの二つのサブスレッドがスレッドの設定可能数(100 +)とExecutorServiceのを使用します。
executor = Executors.newFixedThreadPool((Integer.valueOf(mainController.getIndexController().getThreadsField().getText())));
for(int i = 0; i < newTasks.size(); i++){
Runnable slaveThread = new SlaveThread(dataLink, url);
executor.execute(slaveThread);
}
今のスレッドがファイルをダウンロードするようなものの多くを行いますしかし、私はそれがUIに影響を与えるべきではないと思う。時にはインタフェースから読み込むこともありますが、それは問題ではありません。
私はplatform.runlater()を使用することでUIをフリーズできないと考えました。
Platform.runLater(() -> {
mainController.getIndexController().writeToConsole(result);
});
私はUIを変更する他のコードを持っていないので、これは問題でなければなりません。プログラムは多くのPlatform.runLater()を実行します - それはあまりにも多いですか? どれくらいですか?インターフェイスの方法を私のものよりも頻繁に更新し、うまく動作するスムーズなUIを持つ他のアプリケーションがあります。何が問題なの?ありがとう。
これは、一部のアップデートが失われることを意味しますか? – Joey
いくつかの個別の更新は実行されませんが、それは正しいです。しかし、あなたの更新がUIを更新しているので、フレームがレンダリングされるよりも頻繁に更新する必要はありません。私。 '' label.setText( "X") '、' label.setText( "Y") '、' label.setText( "Z") 'のようにテキストを' "X" 'を設定し、それを' 'Z '' 'に設定すると中間更新はユーザには見えません。 –