1

私は最近、Sun / Oracleの最新のガイドラインでは、コンストラクターを含むSwingオブジェクトのSwingメソッドをEDTの外部で呼び出す必要がないと述べていることを知りました。

同じ厳密さの基準がすべての「ビジュアル」AWTクラスにも適用されますか?そうでない場合、それらのルールは何ですか?

後で

re Swing and EDT:2009年からの議論。

http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-swing-components-on-the-edt.html

引用:「実際のスレッドセーフと、可視性や同期などの関連する問題に加えて、ソフトウェアの問題があると思います。Swingコンポーネントには、ある種の「リスナー」があり、これらのリスナーはEDTで実行するように設計されています。

これらのリスナーは非同期であり、イベント(プロパティの変更など)に応答するため、GUIを構築するときにこれらのリスナーを起動させることができます。その結果、メインスレッドで構築しているときに、一部のリスナーがEDTで実行され、一部のリスナーが他のスレッドでも実行されている可能性があります(リスナーが混乱して間違ったスレッドで起動するため)。その結果、予測できない大きな混乱が生じます。」

多分彼らは彼らが何について話しているのかわからないでしょう...しかし今のところ私は「申し訳ないより安全な」アプローチを取っています。また、Potochkin(http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html )は、後のより厳格なルールに精通していることを読んでいるようです。

4

2 に答える 2

5

マルチスレッド Java プログラムでの正しい同期は、メモリの一貫性プロパティにまとめられている先行発生の関係にかかっています。AWT コンポーネントはスレッド セーフであり、.NET のプライベート ロック オブジェクトで同期することを目的としていました。歴史的な観点については、コメントを参照してください。java.awt.Component

private transient Object objectLock = new Object();

単純なプログラムではこれで十分かもしれませんが、より複雑なプログラムでは、この実装の詳細に関する知識に依存して正しい同期を検証する必要があります。それは可能ですが、脆弱な AWT GUI で妥協したい人はいますか?

いくつかの追加ポイント:

于 2012-09-14T16:47:21.197 に答える
4

あなたは次のように述べています:

なぜAWT?良い質問。私は今、すべての Swing 呼び出しを EDT で行う必要があることに基づいて書き直しています... AWT がもう少し寛容であれば、これはいくつかの単純な GUI の目的に役立つかもしれません...

私の答え:
それは悪い推論です。Swing は非常にパワフルで柔軟性があり、歩く必要がないように購入する前に子犬の足を折るようなものです。Swing を使用し、AWT より面倒なことはほとんどないスレッド化ルールに従い、楽しんでください。スレッドの規則は理にかなっており、従うのは難しくありません。繰り返しますが、この記事はこれについて非常に参考になります。

于 2012-09-14T14:21:01.567 に答える