2

これは初心者の質問です。私は TCP を使用してメッセージを配信する小さなチャット プログラムに取り組んでおり、それを表示するためのシンプルな GUI を持っています。プログラムは完成しましたが、EDT は私をかなり混乱させました...

  1. EDT は「スレッドを拡張する」ように動作しますか? 重いロジックを処理するためにワーカースレッドが必要になるので、それは単一のスレッドだと思いますが、どうやら私は Thread.sleep/yield を実行できません (出力ストリームからメッセージを常に読み取り、jTextArea に追加して実行するwhile ループがあります)。 main Threadで、 false フラグを設定してwhile ループを終了させようとした後、main Threadに譲りましたが、機能しませんでした。)

  2. リスナーがどのように機能するかについてはよくわかりません。それを書かなければならない場合...おそらく、リスナーごとにスレッドを開始します。何かを聞いたらすぐに処理します...しかし、これは間違いなく間違っています。 EDT をマルチスレッド(多くの耳) にしますが、プロセス中はシングルスレッド (脳は 1 つだけ) にします。

これは私の知識不足に違いない!! 頭の中でイベントを発生させる方法がわかりません...ボタンを押すと、Javaは突然知っていますか?私は何かを逃したに違いない。

初めて質問を投稿します。明確であることを願っています

4

1 に答える 1

3

Event Dispatching Thread は、JavaThreadの他のスレッドと似ています。Thread

すべてのイベントと再描画要求のディスパッチを担当します (および synchronized の実行など、その他のいくつかのことRunnable)。EDT をブロックするアクションを実行すると、これらのイベントの処理が停止され、アプリケーションがハングしたように見えます。

UI コンポーネントとのすべての対話は、EDT のコンテキスト内で実行する必要があります。Threadつまり、EDT 以外から UI コンポーネントを作成または更新しようとしないでください。

ブロッキングまたは時間のかかるアクションを実行する必要がある場合は、別のスレッドを使用する必要があります。 SwingWorker開始するのに最適な場所です。

コンポーネントにリスナーを追加しても、スレッドは作成されません。EDT はイベント通知をリスナーに送り返します (これは非常に簡潔な説明ですが、概念は適切です)。これが、EDT をブロックしてはならない理由の 1 つです。

イベントの発生方法は、コンポーネントによって異なります。たとえば、マウスとキーボードのイベントは、OS/実装に依存するコードのネイティブ部分によってイベント キューにポストされます (私が理解しているように、から来ていToolKitますが、間違っている可能性があります)。

actionPerformedによって発生したイベントはJButtons、リスナーに対して (イベント キューを介してディスパッチされずに) 直接実行できますが、EDT 内で実行できます。これは任意の数のイベントによって発生しますが、通常はマウス クリックや特別なキー イベントによって発生します。はJButtonイベント キューに自身を登録するため、これらが通知されます。

仕組みを理解することは良い目標ですが、それは (短期的に) 重要ですか? 自問する必要があります。電灯のスイッチから電灯まで電気がどのように流れるか知っていますか。それとも、それができることだけを気にしますか?

それを使用するために必要なルールを理解し(鋭利なものをパワーポイントに突き刺さないでください)、自信がつくにつれて理解が深まります.

于 2013-03-13T04:29:32.527 に答える