0

JavaFX タスク内で複数のワーカー スレッドを使用するシステムで作業しています。Task 内のこれらのスレッドの Callable オブジェクトは、PropertyChangeSupport を使用して、特定の状態変更情報をリスナーに返します (中間結果など)。私は PropertyChangeListeners を使用してこれらの変更を監視し、他のオブジェクトからアクセスされる派生オブジェクトを作成しています。タスクが終了したら、JavaFX を使用して情報を表示します。その一部は、発行される PropertyChange イベントから収集されます。

私の質問は、Task の終了と処理される PropertyChangeEvents の間に競合状態が発生する可能性があるかどうかです (これは JavaFX アプリケーション スレッドで発生すると想定しますが、完全にはわかりません)。

具体的な例として、複数のステップで処理するためにチャンクに分割される画像を考えてみましょう。各ステップで、中間イメージが生成され、その中間イメージに対して propertyChange イベントが発生します。処理の最後に、最終的な画像とその間に生成されたすべての画像を JavaFX シーンに表示できるようにしたいと考えています。FX スレッドが再描画/更新する前に、propertyChange イベントはすべて処理されますか?

JavaFXのドキュメントには、中間結果を返すことについて説明しているTask APIドキュメントの例があります( JavaFX Task API Documentation )。この例では、JavaFX Observable* オブジェクトを使用しています。PropertyChangeEvents は FX 観測可能オブジェクトと同様に同じスレッドで実行されるため、FX 以外のスレッドの終了と FX スレッドでの結果の取得との間に競合状態があってはならないと思いますが、私が考えていないかもしれない何か。

議論や考えをお寄せいただきありがとうございます。

  • チョーク
4

1 に答える 1

0

PropertyChangeEvents が FX 監視可能オブジェクトと同じスレッドで実行されることは正しいです。ただし、これは Task 自体とは別のスレッドです。

ただし、FX スレッドが再描画/更新する前にすべての propertyChange イベントが処理されるという保証はありません。実際、表示のさまざまな部分が、異なる propertyChange イベント間で、所要時間と関連する特定のタイミングに応じて、複数回再描画される可能性があります。また、他の FX イベントは、propertyChange イベントと再描画の間に散在する可能性があります。ただし、特定の propertyChange イベントによって更新された UI 要素は、更新後のある時点で最終的に再描画されることを保証する必要があります。そのため、表示は最終的に、propertyChange ハンドラーによって行われたすべての変更に「追いつき」、変更されたすべての領域を最終的に再描画します。

于 2014-05-20T07:14:41.043 に答える