Java等待JFrame完成
我有一个登录框架,我必须等待另一个线程。 成功登录框架后自行处理。 我想弹出应用程序的主框架。 现在我正在观看一个布尔值来确定何时启动主框架。 这样做的正确方法是什么? 看一个布尔值只是感觉不优雅。
如果您有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();
完成登录框后,递减Latch:
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。 匿名内部类非常适合捕获上下文,尽管它们的语法非常冗长,但使代码更短。