模块 java.desktop
 java.awt

接口 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();

      // 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
参见:
  • 方法总结

    修饰符和类型
    方法
    描述
    boolean
    阻止当前线程的执行,并在事件派发线程上进入一个新的辅助事件循环。
    boolean
    exit()
    取消阻止被 enter() 方法阻塞的线程的执行并退出二级循环。
  • 方法详情

    • enter

      boolean enter()
      阻止当前线程的执行,并在事件派发线程上进入一个新的辅助事件循环。

      这个方法可以被任何线程调用,包括事件派发线程。该线程将被阻塞,直到exit() 方法被调用或循环终止。将在事件分派线程上创建一个新的辅助循环,用于在任何一种情况下分派事件。

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

      返回:
      true 在辅助循环终止后,如果辅助循环是通过此调用启动的,false 否则
    • exit

      boolean exit()
      取消阻止被 enter() 方法阻塞的线程的执行并退出二级循环。

      此方法恢复调用 enter() 方法的线程并退出调用 enter() 方法时创建的辅助循环。

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

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

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