我有一个登录框,需要等待另一个线程完成。成功登录后,该框将自动关闭。我想要弹出应用程序的主窗口。目前,我正在观察一个布尔值来确定何时启动主窗口。这种方法并不优雅,正确的做法是什么?
CountDownLatch
,并将该锁传递给登录窗体。然后让主窗体等待锁计数变为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();
确保您的登录框没有忘记递减闩锁就退出!一旦 CountDownLatch
达到0,主框架就可以运行。
您还可以使用 Semaphore
或 Condition
(或者从 java.util.concurrent
中选择几个其他选项),但为此目的,CountDownLatch
似乎更容易使用。
在处理Swing(实际上是AWT)时,你需要明确的一点是:必须将所有与AWT事件分发线程(EDT)组件的交互保持一致。
因此,登录时不要使用EDT。使用new Thread
或更好的java.util.concurrent.ExecutorService
。当你发现已经登录成功后,使用java.awt.EventQueue.invokeLater
返回到EDT。匿名内部类非常适合捕获上下文,并且尽管语法可怕而冗长,但可以缩短代码。