モジュール 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
    関連項目:
    Dialog.show(), EventQueue.createSecondaryLoop(), Toolkit.getSystemEventQueue()
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 抽象メソッド 
      修飾子と型 メソッド 説明
      boolean enter​()
      現在のスレッドの実行をブロックし、イベント・ディスパッチ・スレッド上の新しいセカンダリ・イベント・ループに入ります。
      boolean exit​()
      enter()メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリ・ループを抜けます。
    • メソッドの詳細

      • enter

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

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

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

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

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

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

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

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

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