イベントディスパッチスレッド上ではなくSwing/AWTウィジェットを構築しても安全ですか?
-
20-08-2019 - |
質問
を統合してきました 物質 私のアプリケーションを見て触ってみたところ、内部 EDT (イベント ディスパッチ スレッド) チェック ルーチンに関していくつかの問題が発生しました。Substance は、EDT の外部で UI クラスを構築することを絶対に拒否します。私は Swing/AWT をたくさん行ってきたので、EDT に関するルールのほとんどを知っています。コンポーネントを変更するには、SwingWorker、SwingUtilties.invokeLater を使用します。私はいつも、コンポーネントは次のような可能性があると考えていました。 構築済み EDT の外側ですが、必ず 気がついた そして 操作された EDTで。つまり、バックグラウンドでデフォルトを構築および設定できますが、pack/setVisible への呼び出しは、コンポーネントを操作する後続の呼び出しと同様に EDT である必要があります。
私が尋ねる理由は、多くのウィジェット、状態、リソース (多数のアイコン) を含む、特に「頑丈な」ウィンドウを構築する必要があるからです。以前は、SwingWorker のバックグラウンド メソッドでウィンドウを構築し、done メソッドでウィンドウを表示できるようにしました。問題は一度もありませんでした。Substance に切り替えると、内部 EDT チェックが気になります。
コードをリファクタリングしてこれを回避することができました。EDT を使用して構築することもできますが、アプリケーション全体がブロックされるため、良い解決策ではありません。さらにリファクタリングを行って、EDT の外にある追加のリソースをすべてロードできるように最善を尽くすこともできます。
それをまとめると...安全ですか 構築する Swing/AWT ウィジェットはイベント ディスパッチ スレッドにありませんか?
解決
Sunは2004年にルールが変更されました - 前に、あなたは、EDT外部のコンポーネントを作成させ、成分のみ一度EDTに移動しなければならなかったの を実現していた。
。新しいルールが今読みます:
デッドロックの可能性を避けるために、 あなたはスイング細心の注意を取る必要があります コンポーネントとモデルは、 に作成され、 修正、およびのみから照会 イベントディスパッチスレッドます。
のブログ記事には、より多くの細部を与えるrel="noreferrer">その他の関連記事へのリンク。すべての公式日例ことに注意してください>書き換えられ、これについて非常に厳しいされています。
歴史的に、それはおそらく、ルールの再処方をやる気デスクトップマシンなどのマルチコアコンピュータの増加可用性だった - スレッドの問題は、クライアントのスタックに、より多くの明らかになった、とEDTのガイドラインでは非常に厳しいことにより、 、それらの多くが開始することを防止することができる。
他のヒント
いいえ。
単純な理由は、EDT でもまれにデッドロックが発生することがあり、一般に Swing を使用すると UI が簡単にデッドロックしてしまうためです (またはそう言われました)。Kirill (Substance 開発者) のブログにある次の 3 つの記事を読むことをお勧めします。