public interface SecondaryLoop
一个辅助接口,用于运行嵌套事件循环。
实现此接口的对象是使用EventQueue.createSecondaryLoop()方法创建的。该接口提供两个方法,enter()和exit(),可用于启动和停止事件循环。
当调用enter()方法时,当前线程将被阻塞,直到循环被exit()方法终止。此外,一个新的事件循环在事件分发线程上启动,可能是当前线程,也可能不是。可以通过调用其exit()方法在任何线程上终止循环。循环终止后,SecondaryLoop对象可以被重用以运行新的嵌套事件循环。
应用此接口的典型用例是AWT和Swing模态对话框。当模态对话框显示在事件分发线程上时,它进入一个新的次级循环。稍后,当对话框被隐藏或销毁时,它退出循环,线程继续执行。
以下示例说明了次级循环的一个简单用例:
SecondaryLoop loop;
JButton jButton = new JButton("Button");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Toolkit tk = Toolkit.getDefaultToolkit();
EventQueue eq = tk.getSystemEventQueue();
loop = eq.createSecondaryLoop();
// 生成一个新线程来执行工作
Thread worker = new WorkerThread();
worker.start();
// 进入循环以阻塞当前事件处理程序,但保持UI响应
if (!loop.enter()) {
// 报告错误
}
}
});
class WorkerThread extends Thread {
@Override
public void run() {
// 执行计算
doSomethingUseful();
// 退出循环
loop.exit();
}
}
- 自版本:
- 1.7
- 参见:
-
Method Summary
-
Method Details
-
enter
boolean enter()阻塞当前线程的执行,并在事件分发线程上进入一个新的次级事件循环。此方法可以被任何线程调用,包括事件分发线程。该线程将被阻塞,直到调用
exit()方法或循环被终止。无论哪种情况,都将在事件分发线程上创建一个新的次级循环以分派事件。此方法每次只能为一个对象启动一个新的事件循环。如果此对象已经启动了一个次级事件循环并且当前仍在运行,则此方法返回
false,表示未成功启动新的事件循环。否则,此方法将阻塞调用线程,并在新的事件循环终止时返回true。在这种情况下,此对象可以再次用于启动另一个新的事件循环。- 返回值:
-
如果此调用启动了次级循环并在次级循环终止后返回
true,则返回true,否则返回false
-
exit
boolean exit()解除被enter()方法阻塞的线程的执行,并退出次级循环。此方法恢复调用
enter()方法的线程,并退出在调用enter()方法时创建的次级循环。请注意,如果在此循环运行时启动了任何其他次级循环,则阻塞的线程将在嵌套循环终止之前不会恢复执行。
如果此次级循环未使用
enter()方法启动,或者此次级循环已经使用exit()方法完成,此方法将返回false,否则将返回true。- 返回值:
-
如果此循环先前已启动并且尚未使用
exit()方法完成,则返回true,否则返回false
-