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();
}
}
Dialog.show()
,
EventQueue.createSecondaryLoop()
,
Toolkit.getSystemEventQueue()
boolean enter()
该方法可以由任何线程调用,包括事件调度线程。 该线程将被阻塞,直到调用exit()
方法或循环终止。 将在事件分派线程中创建一个新的二级循环,以便在任一情况下调度事件。
此方法只能在每个对象一次启动一个新的事件循环。 如果此对象已经启动了辅助事件循环,并且当前仍在运行,则此方法返回false
以指示在启动新事件循环时不成功。 否则,该方法阻止调用线程,并且当新的事件循环true
时,此方法返回true。 此时,该对象可以再次用于启动另一个新的事件循环。
true
在二次循环
true
后,如果二次循环由此次呼叫启动,
false
false