これは私が理解できない設計上の決定です。
Android と JME はどちらも、アプリを開始したスレッドが UI スレッドであり、リソースを消費するものを別のスレッドにオフロードするように注意するというポリシーに従います。
一方、Swing では、EventQueue.invokeLater(Runnable)
UI とSwingWorker
バックグラウンド処理に使用します。
さて、メインスレッドは何ですか?
スレッドに関するこのSun の記事で述べたように、メイン スレッドでは、GUI の構築を含め、リスクはありますが、やりたいことは何でもできます。
質問に戻る:
Swing は、GUI のみに関連するメイン スレッドでは実装されていません。
コンポーネント開発者は、スレッド プログラミングを深く理解している必要はありません。すべてのコンポーネントがマルチスレッド アクセスを完全にサポートする必要があるツールキットは、特にスレッド プログラミングの専門家ではない開発者にとって、拡張が難しい場合があります。
イベントは予測可能な順序でディスパッチされます: によってエンキューされた実行可能なオブジェクトinvokeLater()
は、マウスおよびキーボード イベント、タイマー イベント、およびペイント要求と同じイベント キューからディスパッチされます。
コンポーネントがマルチスレッド アクセスをサポートするツールキットでは、コンポーネントの変更はスレッド スケジューラの気まぐれでイベント処理とインターリーブされます。これにより、包括的なテストが困難または不可能になります。
オーバーヘッドの削減: 重要なセクションを慎重にロックしようとするツールキットは、ロックの管理にかなりの時間とスペースを費やす可能性があります。
ツールキットがクライアント コードに実装されている可能性のあるメソッド (たとえば、パブリック クラスのパブリック メソッドまたは保護されたメソッド) を呼び出すときは常に、ツールキットはその状態を保存し、すべてのロックを解放して、クライアント コードが必要に応じてロックを取得できるようにする必要があります。
メソッドから制御が戻ると、ツールキットはそのロックを再取得し、その状態を復元する必要があります。ほとんどのアプリケーションは GUI への同時アクセスを必要としませんが、すべてのアプリケーションがこのコストを負担します。
そのため、メイン スレッドを初期化(データと GUI に時間がかかりすぎない限り) に使用できますが、初期化後の GUI ステップのほとんどはイベント ディスパッチ スレッドで自然に発生します。
GUI が表示されると、ほとんどのプログラムは、ボタン アクションやマウス クリックなどのイベントによって駆動されます。イベントは、常にイベント ディスパッチ スレッドで処理されます。
java
ランチャーは Swing (または AWT) 固有ではありません。main
汎用のエントリーポイントです。AWT は、呼び出された後に必要に応じてイベント ディスパッチ スレッドを開始するmain
ため、メイン スレッドを使用できません。EDT を終了して、新しい EDT を開始することもできます。
奇妙なのは、アプレットのライフサイクル メソッドが AWT EDT で呼び出されないことです。
main
メインスレッドは、メソッドを実行するために作成された単なるスレッドです。