1

Swingでは、GUIコンポーネントはスレッドセーフではないため、GUIはEDTによってのみ更新されることになっています。

私の質問は、特定のコンポーネントの更新専用のEDT以外の単一のスレッドがあり、このコンポーネントがプログラム内の他のスレッドからアクセスされていない場合、この専用スレッドのみがアクセスできるかどうかです。私の場合JTable、スレッドがネットワークから情報を受け取り、テーブルを更新します(を使用せずにEventQueue.invokeLater)。他のすべてのコンポーネントはEDTから更新されます。今のところ問題は見ていませんが、やがてバグが発生するのではないかと思っていました。

UPDATE 私の目的は、テーブルをリアルタイムで更新することでした。データは常にネットワークから取得されます。このために、テーブル専用の1つのスレッドを使用して、データが取得されたときに常に更新します。SwingUtilities.invokeLaterを使用する場合、これは、EDTが使用可能になったときにテーブルが更新されることを意味します。スイングはリアルタイムの更新要件に使用されることになっていますか?

4

5 に答える 5

6

それが機能するかどうかについて推論しようとする代わりに、私は、イベントディスパッチスレッドを使用してのみGUIコンポーネントと対話する必要があるというよく知られた「ルール」に固執します。ネットワークからデータを受信したら、SwingUtilities.invokeLater(またはinvokeAndWait)を使用してテーブルを更新するだけです。

すぐには問題が発生しない可能性がありますが、将来発生する可能性は十分にあります。

于 2010-09-04T17:04:15.437 に答える
4

スレッドセーフとして文書化されているいくつかの方法があります。JDK7は、スレッドセーフとして実装できないものもあることがわかったため、少し少ないと思います。ほとんどの場合、Swingはスレッドに対して敵対的であり、AWTEDTスレッドから使​​用する必要があります。これは主に、EventQueue.invokeLater内部で「ランダム」に使用されるためです。また、非表示の共有状態があります(たとえば、各コンポーネントに通知しなくてもPL&Fを変更できます)。一部のクラスはスレッドに依存しないものとして扱うことができるかもしれませんが、そのように文書化されていません。

したがって、答えは、常にSwingにEDTを使用することです。ほとんどのスレッドのバグと同様に、あなたはそれを回避し、その後突然本番環境で失敗するように見えるかもしれません。バグの診断と再現は難しい可能性があります(特に、特定のシステムの本番環境でのみ発生する場合)。ひどく壊れているコードベースを修正するのは楽しいことではないかもしれません。最初からきれいに保ってください。

于 2010-09-04T17:02:15.270 に答える
2

EDTのGUIコンポーネントを更新する必要があります。限目。(このルールにはいくつかのレガシー例外がありますが、いずれにせよ、それらはすべて黙ってEDTに物事を引き継いでいました)。EDTは(ほとんどのウィンドウシステムと同様に)メッセージポンプとして動作します。GUIコンポーネントを更新する場合は、その制約の範囲内で動作する必要があります。

テーブルをすばやく更新する場合は、EDTをクリーンに保ちます。テーブルに大きな負荷をかけないでください。

ライブテーブルの更新を行っている場合は、GlazedListsを確認することを強くお勧めします。GlazedListsには、EDTへの更新の効率的な投稿を処理する非常に優れたSwingThreadProxyList実装があります。このルートに行くには、GlazedListsクールエイドを飲むことに同意する必要がありますが、それは非常においしいクールエイドです(私はGLが大好きです)。

于 2010-09-04T17:50:17.450 に答える
1

競合状態が必要な場合を除いて、これは絶対的なルールです。イベントディスパッチスレッドは、CCTVアプリのディスプレイがハッキングを必要としないほど高速です。

于 2010-09-04T18:10:54.337 に答える
1

Swingは、リアルタイムの更新要件に使用されることを想定していませんか?

いいえ。十分な速度でデータモデルを更新できる場合がありますが、通常、GUIは従属しています。環境内のネットワーク遅延を利用できる場合があります。または、OracleのSun JavaReal-TimeSystemのようなものを検討する必要があるかもしれません。

更新を簡潔に保ち、最小限の正しい同期を使用することで、EDTの「活性」を向上させることができます。ここでは、いくつかの代替案について説明します

于 2010-09-04T17:50:34.463 に答える