1

これは私が理解できない設計上の決定です。

Android と JME はどちらも、アプリを開始したスレッドが UI スレッドであり、リソースを消費するものを別のスレッドにオフロードするように注意するというポリシーに従います。

一方、Swing では、EventQueue.invokeLater(Runnable)UI とSwingWorkerバックグラウンド処理に使用します。

さて、メインスレッドは何ですか?

4

2 に答える 2

4

スレッドに関するこのSun の記事で述べたように、メイン スレッドでは、GUI の構築を含め、リスクはありますが、やりたいことは何でもできます。

  • Swing メソッドはスレッドセーフではありませんが、コンポーネント (Swing またはそれ以外) が実現されていない限り (コンポーネントの paint() メソッドが呼び出された、または呼び出される可能性があることを意味します)、2004 年までは問題ありませんでした。
  • 2004 年以降、このSO の質問で指摘されているように、EDT で GUIを作成することが義務付けられています。

質問に戻る:

Swing は、GUI のみに関連するメイン スレッドでは実装されていません。

  • コンポーネント開発者は、スレッド プログラミングを深く理解している必要はありません。すべてのコンポーネントがマルチスレッド アクセスを完全にサポートする必要があるツールキットは、特にスレッド プログラミングの専門家ではない開発者にとって、拡張が難しい場合があります。

  • イベントは予測可能な順序でディスパッチされます: によってエンキューされた実行可能なオブジェクトinvokeLater()は、マウスおよびキーボード イベント、タイマー イベント、およびペイント要求と同じイベント キューからディスパッチされます。
    コンポーネントがマルチスレッド アクセスをサポートするツールキットでは、コンポーネントの変更はスレッド スケジューラの気まぐれでイベント処理とインターリーブされます。これにより、包括的なテストが困難または不可能になります。

  • オーバーヘッドの削減: 重要なセクションを慎重にロックしようとするツールキットは、ロックの管理にかなりの時間とスペースを費やす可能性があります。
    ツールキットがクライアント コードに実装されている可能性のあるメソッド (たとえば、パブリック クラスのパブリック メソッドまたは保護されたメソッド) を呼び出すときは常に、ツールキットはその状態を保存し、すべてのロックを解放して、クライアント コードが必要に応じてロックを取得できるようにする必要があります。
    メソッドから制御が戻ると、ツールキットはそのロックを再取得し、その状態を復元する必要があります。ほとんどのアプリケーションは GUI への同時アクセスを必要としませんが、すべてのアプリケーションがこのコストを負担します。

そのため、メイン スレッドを初期化(データと GUI に時間がかかりすぎない限り) に使用できますが、初期化後の GUI ステップのほとんどはイベント ディスパッチ スレッドで自然に発生します。
GUI が表示されると、ほとんどのプログラムは、ボタン アクションやマウス クリックなどのイベントによって駆動されます。イベントは、常にイベント ディスパッチ スレッドで処理されます。

于 2009-02-21T13:02:59.887 に答える
1

javaランチャーは Swing (または AWT) 固有ではありません。main汎用のエントリーポイントです。AWT は、呼び出された後に必要に応じてイベント ディスパッチ スレッドを開始するmainため、メイン スレッドを使用できません。EDT を終了して、新しい EDT を開始することもできます。

奇妙なのは、アプレットのライフサイクル メソッドが AWT EDT で呼び出されないことです。

mainメインスレッドは、メソッドを実行するために作成された単なるスレッドです。

于 2009-02-21T18:53:27.890 に答える