基本的なクエリについて説明する前に、私の質問が AWT/Swing フレームワークの標準に反していることを十分認識していることをまず述べておきたいと思います。私の質問は単に学問的経験としてのものであり、(できれば) 現実世界のアプリケーションには適用されるべきではありません。
AWT/Swing フレームワークは、単一のスレッドを使用してイベントをディスパッチするイベント ベースのモデルに基づいて構築されています。すべての AWT/Swing 関連のイベント イベントはイベント ディスパッチャー スレッド (EDT) で処理する必要があり、プログラマーがプログラムしたカスタム イベントは関数 invokeAndWait() および invokeLater() を介してキューに入れる必要があります。このモデルは、フレームワークがスレッドの同時実行性の問題に悩まされることは決してないことを保証しますが、その周りにコードを書こうとするプログラマーに大きな苦痛を与えます (stackoverflow でスイングの問題を検索してください... かなりの一握りです)。
しかし...数年前、私はAWT/SwingモデルとEDTに慣れる前に、多くのJava標準に違反するコードを書いていました(合理的なプログラマーを恐怖に陥れるコード)。私が違反したこれらの標準の 1 つは、EDT ではないスレッドを介して GUI を更新するメソッドを呼び出すことでした。正確には、現在の進行状況で JLabel を定期的に更新するセカンダリ スレッドに常駐する標準的な「長い」タスクでした。コードを見直してみると、コードが標準に直接違反しているにもかかわらず、100% の確率で機能することがわかりました。ちらつき、テキストの破損 (JLabel であるため)、ランダムな例外のスロー、異常な GUI 動作はありませんでした。もちろん、私は1つの小さな例から知っています. AWT/Swing 標準が過保護または不必要であると単純に判断することはできません。そしてこれで、私の質問は次のとおりです。
JLabel の更新のような単純なタスク (一定の速度でなくても、おそらく 1 秒に 1 回か 2 回) では、EDT を介してそれを実行することが本当に必要なのでしょうか? そして、(Java プログラミング コミュニティ全体から軽蔑されていることを除けば) これが意味する可能性のあるものは何ですか?
1 つのスレッドのみが GUI (EDT ではない) を更新し、更新の頻度が低く、アトミック操作 (文字列、プリミティブ データの更新など) でのみ更新されるモデルを想定すると、プログラムは、 EDT(これはハックと見なされると思いますか?)。
課題として、別のスレッドからイベントをディスパッチすることで AWT/Swing モデルに違反していることを示すコードを誰かが思いつくことができるかどうか疑問に思っていました。 GUI が 1 フレームの間ちらつく) 問題はありますか?
ところで、これは無関係かもしれませんが、新しい JFrame/Window オブジェクトに対して新しい EDT スレッドが生成されるのでしょうか、それともそれらすべてが同じスレッドから実行されるのでしょうか? リソースを大量に消費するマルチウィンドウ システムがすべて 1 つのスレッドで実行されているとは想像できません。
注: 私は AWT/Swing フレームワークのソース コードを見たことも分析したこともありません。私の知識はすべて、インターネットでの調査と個人的な経験に基づいています。上記の間違いがあれば、お気軽に訂正してください。上記の私の例にまだショックを受けているプログラマーのために、私はすべてのプロジェクトを標準に準拠するように更新しました (なんて面倒なことでしょう)。