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
-