2009-03-20 10 views
6

Opera 9.64 Build 10487のJVM 1.6.0_12で動作するアプレットのスレッドダンプがあります.3つのイベントキューが表示されます。私が知っている限り、Java Swingのイベント処理はシングルスレッドです - この変更は最近更新されましたか?複数のAWTイベントキューを使用できますか?

私の問題は、複数のイベントキューがデッドロックを引き起こす傾向があるということです。なぜなら、私はGUIのTreeLockだけよりもいくつかのロックを持っているからです。

答えて

8

複数の可能性があり、ブラウザによって異なります。 EventQueue documentation

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

+0

これは説明になります。しかし、アプレットは1つしかないので、コードベースは1つだけです。おそらくオペラはフレームごとに1つのスレッドを開始します - それはJavaスクリプトの場合と同様です – tigger

4

はい。通常、Toolkit.getDefaultToolkitにはToolkitが1つだけありますが、から複数のEventQueueがあります(1.2.2から通常は正常に呼び出すためのアクセス権があります)。スタックにはとClassLoaderに基づく魔法があり、返すものはEventQueueです。

アプレットは、その起源と構成に応じてパーティション化されます。これがどのように行われるかは、実装に依存します。

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

2

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

しかし、いくつかのレベルのモーダルダイアログ(1つのメインキュー+ダイアログあたり1つのキュー、または1つのメインキュー+すべてのダイアログの1つのキュー)を使用しているときに何が起こるかわかりません。

2

"実際には間違っています。モーダルダイアログを表示すると、新しいEventQueue(スレッドIIRC)が作成されます。私はこれまでSwingの男と話しましたが、Swingは既存のイベントキューに新しいフィルタを追加して、異なるソース(ウィンドウ/コンポーネント)からのイベントをフィルタリングします。したがって、モーダルダイアログには新しいスレッド/ EQは作成されません。これを確認するには、モーダルダイアログを開き、モーダルダイアログの前後でスレッドダンプを取得し、AWTスレッドコールスタックを比較します。少なくとも、それは標準的なJavaアプリケーションとの関係です。私はアプレットケースをまだチェックしていませんでした。

関連する問題