7

Opera9.64ビルド10487のJVM1.6.0_12で実行されているアプレットのスレッドダンプがあります。これには3つのイベントキューが表示されます。Java Swingイベント処理がシングルスレッドであることがわかっている限り、この変更は最近の更新で行われましたか?

私の問題は、GUI TreeLockだけよりも多くのロックがあるため、複数のイベントキューがデッドロックを引き起こす傾向があることです。

4

4 に答える 4

8

複数存在する可能性があり、ブラウザによって異なります。EventQueueのドキュメントによると:

一部のブラウザは、異なるコードベースのアプレットを個別のコンテキストに分割し、これらのコンテキスト間に壁を確立します。このようなシナリオでは、コンテキストごとに1つのEventQueueがあります。他のブラウザは、すべてのアプレットを同じコンテキストに配置します。これは、すべてのアプレットに対して単一のグローバルEventQueueのみが存在することを意味します。この動作は実装に依存します。

于 2009-03-20T08:33:29.353 に答える
4

はい。通常、は1つだけToolkitですが、からはToolkit.getDefaultToolkit複数あります(1.2.2からは、通常、正常に呼び出すためのアクセス許可を取得します)。スタックに基づいてとsを使用して、どちらを返すかを決定する魔法があります。EventQueueToolkit.getSystemEventQueueThreadGroupClassLoaderEventQueue

アプレットは、その起源と構成に応じて分割されます。これがどのように行われるかは、実装によって異なります。

さて、おそらく表示されているのは、アプレットとセキュアコンテキストのイベントキューです。セキュアコンテキストは、プラグイン自体からのダイアログボックスを処理します。証明書などを受け入れる。安全なコンテキストは、これらをアプレットコンテキストのユーザーコードから遠ざけます。

于 2009-03-20T13:42:53.667 に答える
2

さらに、モーダル ダイアログを表示すると、Swing は新しい EventQueue (およびスレッド IIRC) を作成します。このイベント キューは、モーダル ダイアログが閉じられるまでアクティブです (前のイベント キューは「保留中」です)。

ただし、いくつかのレベルのモーダル ダイアログ (ダイアログごとに 1 つのメイン キュー + 1 つのキュー、またはすべてのダイアログに対して 1 つのメイン キュー + 1 つのキュー) を使用するとどうなるかはわかりません。

于 2009-03-25T06:21:28.553 に答える
2

「モーダル ダイアログを表示すると、Swing は新しい EventQueue (およびスレッド IIRC) を作成します」 実際には間違っています。少し前にこれについて Swing の担当者と話しましたが、Swing は既存のイベント キューに新しいフィルターを追加して、別のソース (ウィンドウ/コンポーネント) からのイベントを除外するだけです。そのため、モーダル ダイアログ用の新しいスレッド/EQ は作成されません。これを確認するには、モーダル ダイアログを開いて、モーダル ダイアログを開く前後にスレッド ダンプを取得し、AWT スレッド コール スタックを比較します。少なくとも、標準のJavaアプリではそうです。アプレットケースはまだチェックしていません。

于 2010-05-07T15:46:05.983 に答える