我有一个登录框架,我必须等待另一个线程。成功登录框架后自行处理。我想弹出应用程序的主框架。现在我正在观看一个布尔值来确定何时启动主框架。这样做的正确方法是什么?看一个布尔值只是感觉不太优雅。
答案 0 :(得分:11)
如果您有Java 5或更高版本,则可以使用CountDownLatch。例如,假设主框架最初处于控制状态,请让主框架创建{倒计数为1的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();
登录框完成后,递减Latch:
loginSignal.countDown();
确保您的登录框架无法退出忘记闩锁的位置!一旦CountDownLatch
达到0,主框架就会变为可运行。
您还可以使用Semaphore
或Condition
(或java.util.concurrent
中的任何其他选项),但为此,CountDownLatch
似乎更容易使用
答案 1 :(得分:2)
处理Swing(实际上是AWT)时你真正必须理解的是,你需要保持与AWT事件调度线程(EDT)组件的所有交互。
所以,请从EDT登录。使用new Thread
或更好的java.util.concurrent.ExecutorService
。当您发现自己已登录时,请使用java.awt.EventQueue.invokeLater
返回EDT。匿名内部类非常适合捕获上下文,尽管它们的语法非常冗长,但代码更短。