3

別のスレッドから待たなければならないログイン フレームがあります。ログインが成功すると、フレームはそれ自体を破棄します。そして、アプリケーションのメイン フレームをポップアップ表示したいと考えています。現在、ブール値を監視して、メイン フレームを起動するタイミングを決定しています。これを行う正しい方法は何ですか?ブール値を見るだけではエレガントに感じられません。

4

2 に答える 2

11

Java 5 以降が利用可能な場合は、CountDownLatchを使用できます。たとえば、メイン フレームが最初に制御されていると仮定すると、メイン フレームにCountDownLatchカウント ダウン 1 で を作成させ、このラッチをログイン フレームに渡します。次に、ラッチが 0 になるまでメイン フレームを待機させます。

CountDownLatch loginSignal = new CountDownLatch(1);
     ...    // Initialize login frame, giving it loginSignal 
     ...    // execute login frame in another Thread
// This await() will block until we are logged in:
loginSignal.await();

ログイン フレームが完了したら、ラッチをデクリメントします。

loginSignal.countDown();

ラッチをデクリメントするのを忘れた場所でログイン フレームが終了する方法がないことを確認してください。が 0 になるとすぐにCountDownLatch、メイン フレームは実行可能になります。

SemaphoreまたはCondition(または からの他のいくつかの選択肢のいずれか) を使用することもできますjava.util.concurrentが、この目的では、CountDownLatchを使用する方が簡単なようです。

于 2009-04-28T20:31:33.000 に答える
2

Swing (および実際には AWT) を扱う際に本当に理解しなければならないことは、AWT Event Dispatch Thread (EDT) のコンポーネントとのすべての対話を維持する必要があるということです。

そのため、EDT からログインしてください。new Thread、またはより良いを使用しjava.util.concurrent.ExecutorServiceます。ログインしていることがわかったら、 を使用java.awt.EventQueue.invokeLaterして EDT に戻ります。匿名の内部クラスは、コンテキストをキャプチャするのに優れており、恐ろしく冗長な構文にもかかわらず、コードを短くします。

于 2009-04-28T23:41:33.060 に答える