2016-04-14 12 views
0

重いコンピューティングを行う複数のスレッドを実行する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を持つ他のアプリケーションがあります。何が問題なの?ありがとう。

答えて

2

あなたの質問から確かに分かりませんが、Platform.runLater(...)を何度も呼び出すことによってFXアプリケーションスレッドへの多くの実行可能ファイルにスケジューリングしているように思えます。 「多くの人は何人いるのか」というのは、多くの要因によって決まりますが、一般的には、消費するよりも頻繁にスケジュールを設定すべきではありません。

通常、これは、スケジュールされた前の更新が実行されたときにUIの新しい更新をスケジュールすることによってのみ実行できます。これを行う方法については、Throttling javafx gui updatesを参照してください。

+0

これは、一部のアップデートが失われることを意味しますか? – Joey

+0

いくつかの個別の更新は実行されませんが、それは正しいです。しかし、あなたの更新がUIを更新しているので、フレームがレンダリングされるよりも頻繁に更新する必要はありません。私。 '' label.setText( "X") '、' label.setText( "Y") '、' label.setText( "Z") 'のようにテキストを' "X" 'を設定し、それを' 'Z '' 'に設定すると中間更新はユーザには見えません。 –

0

あなたは、UIが、あまりにも多くのPlatform.runLater呼び出しを使用するよりもデッドロック状態に似ていることを、私に完全に凍結させると言うことは事実です。デッドロックを検出するために使用できるさまざまなツールがあります。あまりにも多くのPlatform.runLaterコールを使用すると、通常はコールのキューが構築されているため、システムが遅くなります。