Module java.desktop
Package java.awt

Interface SecondaryLoop


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

    Modifier and Type
    Method
    Description
    boolean
    enter()
    阻塞当前线程的执行,并在事件分发线程上进入一个新的次级事件循环。
    boolean
    exit()
    解除被enter()方法阻塞的线程的执行,并退出次级循环。
  • Method Details

    • enter

      boolean enter()
      阻塞当前线程的执行,并在事件分发线程上进入一个新的次级事件循环。

      此方法可以被任何线程调用,包括事件分发线程。该线程将被阻塞,直到调用exit()方法或循环被终止。无论哪种情况,都将在事件分发线程上创建一个新的次级循环以分派事件。

      此方法每次只能为一个对象启动一个新的事件循环。如果此对象已经启动了一个次级事件循环并且当前仍在运行,则此方法返回false,表示未成功启动新的事件循环。否则,此方法将阻塞调用线程,并在新的事件循环终止时返回true。在这种情况下,此对象可以再次用于启动另一个新的事件循环。

      返回值:
      如果此调用启动了次级循环并在次级循环终止后返回true,则返回true,否则返回false
    • exit

      boolean exit()
      解除被enter()方法阻塞的线程的执行,并退出次级循环。

      此方法恢复调用enter()方法的线程,并退出在调用enter()方法时创建的次级循环。

      请注意,如果在此循环运行时启动了任何其他次级循环,则阻塞的线程将在嵌套循环终止之前不会恢复执行。

      如果此次级循环未使用enter()方法启动,或者此次级循环已经使用exit()方法完成,此方法将返回false,否则将返回true

      返回值:
      如果此循环先前已启动并且尚未使用exit()方法完成,则返回true,否则返回false