別のスレッドから待たなければならないログイン フレームがあります。ログインが成功すると、フレームはそれ自体を破棄します。そして、アプリケーションのメイン フレームをポップアップ表示したいと考えています。現在、ブール値を監視して、メイン フレームを起動するタイミングを決定しています。これを行う正しい方法は何ですか?ブール値を見るだけではエレガントに感じられません。
2 に答える
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
を使用する方が簡単なようです。
Swing (および実際には AWT) を扱う際に本当に理解しなければならないことは、AWT Event Dispatch Thread (EDT) のコンポーネントとのすべての対話を維持する必要があるということです。
そのため、EDT からログインしてください。new Thread
、またはより良いを使用しjava.util.concurrent.ExecutorService
ます。ログインしていることがわかったら、 を使用java.awt.EventQueue.invokeLater
して EDT に戻ります。匿名の内部クラスは、コンテキストをキャプチャするのに優れており、恐ろしく冗長な構文にもかかわらず、コードを短くします。