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();
// Spawn a new thread to do the work
Thread worker = new WorkerThread();
worker.start();
// Enter the loop to block the current event
// handler, but leave UI responsive
if (!loop.enter()) {
// Report an error
}
}
});
class WorkerThread extends Thread {
@Override
public void run() {
// Perform calculations
doSomethingUseful();
// Exit the loop
loop.exit();
}
}
- 自从:
- 1.7
- 参见:
-
方法总结
-
方法详情
-
enter
boolean enter()阻止当前线程的执行,并在事件派发线程上进入一个新的辅助事件循环。这个方法可以被任何线程调用,包括事件派发线程。该线程将被阻塞,直到
exit()方法被调用或循环终止。将在事件分派线程上创建一个新的辅助循环,用于在任何一种情况下分派事件。此方法一次只能为每个对象启动一个新的事件循环。如果该对象已经启动了次级事件循环并且当前仍在运行,则此方法返回
false以指示它没有成功启动新的事件循环。否则,此方法会阻塞调用线程,并在新事件循环终止时返回true。这时,这个对象可以再次用于启动另一个新的事件循环。- 返回:
true在辅助循环终止后,如果辅助循环是通过此调用启动的,false否则
-
exit
boolean exit()取消阻止被enter()方法阻塞的线程的执行并退出二级循环。此方法恢复调用
enter()方法的线程并退出调用enter()方法时创建的辅助循环。请注意,如果在此循环运行时启动了任何其他辅助循环,则在嵌套循环终止之前,被阻塞的线程将不会恢复执行。
如果此辅助循环尚未使用
enter()方法启动,或者此辅助循环已使用exit()方法完成,则此方法返回false,否则返回true。- 返回:
true如果此循环先前已启动且尚未使用exit()方法完成,false否则
-