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(); } }
Dialog.show()
, EventQueue.createSecondaryLoop()
, Toolkit.getSystemEventQueue()
boolean enter()
このメソッドは、イベントディスパッチスレッドを含む任意のスレッドで呼び出すことができます。exit()
メソッドが呼び出されるかループが終了するまで、このスレッドはブロックされます。どちらの場合でも、イベントをディスパッチするために新しいセカンダリループがイベントディスパッチスレッド上に作成されます。
このメソッドで一度に開始できる新しいイベントループは、オブジェクトあたり 1 つだけです。このオブジェクトによってセカンダリイベントループがすでに開始され、現在も実行されている場合、このメソッドは、新しいイベントループを開始できなかったことを示す false
を返します。それ以外の場合、このメソッドは呼び出し側スレッドをブロックし、あとで新しいイベントループが終了したときに true
を返します。その時点で、このオブジェクトを再度使用して、別の新しいイベントループを開始できます。
true
、それ以外の場合は false
boolean exit()
enter()
メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリループを抜けます。
このメソッドは、enter()
メソッドを呼び出したスレッドを再開し、enter()
メソッドの呼び出し時に作成されたセカンダリループを終了します。
このループの実行中にほかのセカンダリループが開始されている場合、そのネストされたループが終了するまで、ブロックされているスレッドは実行を再開しません。
このセカンダリループが enter()
メソッドで開始されていない場合、または、このセカンダリループがすでに exit()
メソッドで終了されている場合、このメソッドは false
を返します。それ以外の場合は true
を返します。
exit()
メソッドで終了されていない場合は true
、それ以外の場合は false
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.