モジュール java.desktop
パッケージ java.awt

インタフェースSecondaryLoop


public interface SecondaryLoop
ネストされたイベント・ループを実行するためのヘルパー・インタフェース。

このインタフェースを実装するオブジェクトは、EventQueue.createSecondaryLoop()メソッドで作成されます。 このインタフェースは、イベント・ループの開始と停止に使用できる2つのメソッド、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
    enter()メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリ・ループを抜けます。
  • メソッドの詳細

    • enter

      boolean enter()
      現在のスレッドの実行をブロックし、イベント・ディスパッチ・スレッド上の新しいセカンダリ・イベント・ループに入ります。

      このメソッドは、イベント・ディスパッチ・スレッドを含む任意のスレッドで呼び出すことができます。 exit()メソッドが呼び出されるかループが終了するまで、このスレッドはブロックされます。 どちらの場合でも、イベントをディスパッチするために新しいセカンダリ・ループがイベント・ディスパッチ・スレッド上に作成されます。

      このメソッドで一度に開始できる新しいイベント・ループは、オブジェクトあたり1つだけです。 このオブジェクトによってセカンダリ・イベント・ループがすでに開始され、現在も実行されている場合、このメソッドは、新しいイベント・ループを開始できなかったことを示すfalseを返します。 それ以外の場合、このメソッドは呼出し側スレッドをブロックし、あとで新しいイベント・ループが終了したときにtrueを返します。 その時点で、このオブジェクトを再度使用して、別の新しいイベント・ループを開始できます。

      戻り値:
      この呼出しによってセカンダリ・ループが開始された場合はセカンダリ・ループの終了後にtrue、それ以外の場合はfalse
    • exit

      boolean exit()
      enter()メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリ・ループを抜けます。

      このメソッドは、enter()メソッドを呼び出したスレッドを再開し、enter()メソッドの呼出し時に作成されたセカンダリ・ループを終了します。

      このループの実行中にほかのセカンダリ・ループが開始されている場合、そのネストされたループが終了するまで、ブロックされているスレッドは実行を再開しません。

      このセカンダリ・ループがenter()メソッドで開始されていない場合、または、このセカンダリ・ループがすでにexit()メソッドで終了されている場合、このメソッドは falseを返します。それ以外の場合はtrueを返します。

      戻り値:
      このループがすでに開始され、まだexit()メソッドで終了されていない場合はtrue、それ以外の場合はfalse