3

我有一个登录框架,我必须等待另一个线程。登录成功后,框架会自行处理。我想弹出应用程序的主框架。现在我正在观察一个布尔值来确定何时启动主框架。这样做的正确方法是什么?看一个布尔值并不优雅。

4

2 回答 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,主框架就变为可运行的。

您也可以使用 aSemaphoreCondition(或 中的任何其他选项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 回答