我有一个登录框架,我必须等待另一个线程。登录成功后,框架会自行处理。我想弹出应用程序的主框架。现在我正在观察一个布尔值来确定何时启动主框架。这样做的正确方法是什么?看一个布尔值并不优雅。
问问题
10057 次
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();
确保您的登录框架无法退出它忘记减少闩锁的地方!一旦CountDownLatch
达到 0,主框架就变为可运行的。
您也可以使用 aSemaphore
或Condition
(或 中的任何其他选项java.util.concurrent
),但出于此目的, aCountDownLatch
似乎更易于使用。
于 2009-04-28T20:31:33.000 回答
2
在处理 Swing(实际上是 AWT)时,您真正必须了解的是,您需要保持与 AWT 事件调度线程 (EDT) 组件的所有交互。
因此,请从 EDT 登录。使用 anew Thread
或更好的 a java.util.concurrent.ExecutorService
。当您发现您已登录时,请使用java.awt.EventQueue.invokeLater
回到 EDT。匿名内部类非常适合捕获上下文,尽管它们的语法非常冗长,但可以使代码更短。
于 2009-04-28T23:41:33.060 回答