アレクサンダーの答えは、あなたの質問に関する最も重要な点を捉えています.
この回答は、いくつかの補足情報を提供します。
JavaFX イベント ディスパッチャー スレッドが例外をスローするのはいつですか。
JavaFX システムは、アクティブなシーン グラフに影響を与えるオブジェクトへのアクセスが JavaFX スレッドに適切に制限されていることを常にチェックするわけではありません。最終的に、このようなスレッドの安全性を確保するのは、JavaFX システムではなく、JavaFX アプリケーション プログラマの責任です。JavaFX でマルチスレッド プログラミングを実行するときは十分に注意する必要があります。そうしないと、アプリケーションの動作が失敗したり、予測不能になったりする可能性があります。
これに関する適切なドキュメントはありますか
JavaFX チュートリアル: Concurrency in JavaFX を試してください。
run() メソッドで Platform.runLater を使用する簡単な (より短くよりクリーンな) 方法はありますか?
No.Platform.runLater
はとてもシンプルです。
余談として 。. .
タスクとサービス
WorkerのTaskまたはServiceサブクラスの使用を検討してください。これらはFutureTask (これはRunnableです) の JavaFX ラッパーです。ワーカーは、バックグラウンド スレッドでロジックを実行するためのcallメソッドを提供します。それらは実行ステータスを維持し(状態変更のための JavaFX スレッドへのスレッドセーフなコールバック通知を使用して)、value、message、およびexceptionプロパティを介して呼び出しの結果を返します。
Task
およびjavadoc の例のデザイン パターンを利用して、Service
次のような機能を備えたスレッド セーフなアプリケーションを簡単に作成できます。
- UI 更新のためのデータの非同期フェッチ。
- タスクの進行状況に関する定期的なメッセージの更新。
- 表示されたシーンにまだアタッチされていないノード グラフの作成。
- プログレスバーなどによる進行状況の監視
AWorker
は を補完しPlatform.runLater
ます。Platform.runLater
JavaFX アプリケーション スレッドから実行していて、JavaFX アプリケーション スレッドで何らかのロジックを実行する場合に使用します。Worker
JavaFX アプリケーション スレッドで実行していて、新しいスレッドでロジックまたは (特に) I/O を生成して、JavaFX アプリケーション スレッドをブロックしないようにする場合は、 a を使用します。Platform.runLater
のメソッド内でネットワーク I/O を実行したくはないでしょうが、のrun
メソッドで実行したいことがよくあります。Worker
call
また、 と の使用は の使用Task
とService
互換性がありませんPlatform.runLater
。たとえば、実行時間が非常に長くTask
、定期的に、またはバッファがいっぱいになったときに、部分的な結果を UI に返したい場合Platform.runLater
は、タスクのcall
メソッドで実行するのがその方法です。
ワーカーは、ライブラリによって提供される既存のスレッド化されたサービスがなく、代わりに独自のスレッドを作成してバックグラウンドで実行する場合に役立ちます。既存のスレッド化されたサービスがある場合はPlatform.runLater
、JavaFX アプリケーション スレッドでロジックを実行するために を使用する必要があります。
を使用する場合でも、何をしているのかを知る必要があることに注意してWorker
ください アクティブなシーン グラフ上のノードを更新しないなど、標準の JavaFX 同時実行ルールに違反しないように注意する必要があります (アクティブなシーン グラフ内のノードがバインドされている値を更新しないことを含む -アイテムバッキングの観察可能なリストなど)。 ListView ) 。