2

メイン スレッドがフレームを作成した後、フレームは終了しますが、イベント ディスパッチャ マシンによって作成された非デーモン スレッドが原因で、JVM は終了しません。しかし、私の質問は、メインスレッドが終了するとすぐにスタックもなくなるため、フレームの参照がなくなるため、いつでもフレームオブジェクトをガベージコレクションできるということです。しかし、これが起こっていないのはなぜですか?

4

1 に答える 1

3

ご指摘のとおり、Swing イベント スレッドは非デーモン スレッドであるため、実行中はアプリケーションが終了できません。

しかし

しかし、私の質問は、メインスレッドが終了するとすぐにスタックもなくなるため、フレームの参照がなくなるため、いつでもフレームオブジェクトをガベージコレクションできるということです。

これは、オブジェクトが GC 対象としてマークされる理由ではありません。アクティブなスレッドでアクティブな参照が存在する必要はありませんが、EDT のためにこの条件は満たされていません。

オブジェクトへの参照がなくなると、そのオブジェクトはガベージ コレクションの対象になります。変数に保持されている参照は、通常、変数がスコープ外になると削除されます。または、変数を特別な値 null に設定することで、オブジェクト参照を明示的に削除できます。プログラムは同じオブジェクトへの複数の参照を持つことができることに注意してください。オブジェクトがガベージ コレクションの対象になる前に、オブジェクトへのすべての参照を削除する必要があります。参照


コメントであなたの状態を編集
/私の返信:

ボタンが初めてクリックされると、そのイベントがイベントキューに入り、そこからイベントディスパッチャーマシンがこのイベントの EDT を作成し、アクション実行メソッドを実行します。

いいえ。GUI が表示されるとすぐに、Swing EDT が作成されます。したがって、ボタンが GUI に表示される場合、その GUI が作成され、実行中の EDT に表示されます。ボタンを押しても EDT は作成されません。代わりに、Runnables をイベント キューに入れ、EDT で処理することができます。

実行が完了したら、もう一度ボタンを押すと、イベントがイベントキューに入ります。同じスレッドを 2 回開始することはできないため、マシンは別のスレッドを開始する必要があります。

もう一度いいえ。継続的に実行される EDT は 1 つだけです。を介して、またはSwingWorker オブジェクトを呼び出して、明示的に新しい Thread を作成して開始しない限り、新しいスレッドは作成されません。new Thread(...).start()execute()

于 2013-07-20T18:14:43.893 に答える