2

ネットでこれを検索しましたが、まだ答えが見つかりませんでした。多分あなたの誰かがこれを知っています。

私はアプリケーションのようなスイングデスクトップを開発しています。スイングはスレッドセーフではないことがわかっているので(EDTの外部でJComponentのメソッドを呼び出すと、EDT自体でデッドロックが発生する可能性が常にあります)、スレッドによって例外がスローされます。そのメソッドを呼び出そうとしています..もっとよく説明させてください:

EDTとバックグラウンドワーカー(「BW」)の2つのスレッドがあるとします。たとえばJButton.setText()、またはJButton.setIcon()BW内で電話をかけると、EDTでデッドロックが発生する可能性があります。さて、BWが呼び出しJButton.setText()て例外がスローされたときに、私が非常に間違っていることを示したいと思います。

VS2008のC#がデフォルトでこれを実行していることがわかります(この動作を無効にする方法があるかどうかはわかりませんが、不正なコードを検出することは非常に便利だと思います)。Javaで同様の効果を達成する方法はありますか?

4

3 に答える 3

3

Swing スレッド違反をチェックする方法について説明しているこの記事を見てください。RepaintManagerすべての違反をキャッチするわけではありませんが、ほとんどの違反をキャッチします。

そのクラスを簡単に調整してException、スタック トレースを出力するだけで s isoをスローできます

于 2012-06-07T21:13:04.503 に答える
1

をご覧くださいSwingUtilities.isEventDispatchThreadtrueこれを呼び出すと、呼び出しが EDT 内から行われた場合は返され、それ以外の場合は返されfalseます。

問題は、おそらくコードの複数の場所でそのような呼び出しを行う必要があることです。それはもっと仕事です。

于 2012-06-08T07:59:40.437 に答える
1

リフレクションで生成された Proxy にある各スイング オブジェクトをラップします。そのプロキシを作成して、スレッドを既知の適切な EDT スレッドと比較します。一致しない場合は、RuntimeException をスローします。

于 2012-06-07T20:51:51.803 に答える