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()
現在のスレッドの実行をブロックし、イベント・ディスパッチ・スレッド上の新しいセカンダリ・イベント・ループに入ります。
|
boolean |
exit()
enter() メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリ・ループを抜けます。 |
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, 2014, Oracle and/or its affiliates. All rights reserved.