このインタフェースを実装するオブジェクトは、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
- 関連項目:
-
メソッドのサマリー
-
メソッドの詳細
-
enter
boolean enter()現在のスレッドの実行をブロックし、イベント・ディスパッチ・スレッド上の新しいセカンダリ・イベント・ループに入ります。このメソッドは、イベント・ディスパッチ・スレッドを含む任意のスレッドで呼び出すことができます。
exit()メソッドが呼び出されるかループが終了するまで、このスレッドはブロックされます。 どちらの場合でも、イベントをディスパッチするために新しいセカンダリ・ループがイベント・ディスパッチ・スレッド上に作成されます。このメソッドで一度に開始できる新しいイベント・ループは、オブジェクトあたり1つだけです。 このオブジェクトによってセカンダリ・イベント・ループがすでに開始され、現在も実行されている場合、このメソッドは、新しいイベント・ループを開始できなかったことを示す
falseを返します。 それ以外の場合、このメソッドは呼出し側スレッドをブロックし、あとで新しいイベント・ループが終了したときにtrueを返します。 その時点で、このオブジェクトを再度使用して、別の新しいイベント・ループを開始できます。- 戻り値:
- この呼出しによってセカンダリ・ループが開始された場合はセカンダリ・ループの終了後に
true、それ以外の場合はfalse
-
exit
boolean exit()enter()メソッドによってブロックされたスレッドの実行をブロック解除し、セカンダリ・ループを抜けます。このメソッドは、
enter()メソッドを呼び出したスレッドを再開し、enter()メソッドの呼出し時に作成されたセカンダリ・ループを終了します。このループの実行中にほかのセカンダリ・ループが開始されている場合、そのネストされたループが終了するまで、ブロックされているスレッドは実行を再開しません。
このセカンダリ・ループが
enter()メソッドで開始されていない場合、または、このセカンダリ・ループがすでにexit()メソッドで終了されている場合、このメソッドはfalseを返します。それ以外の場合はtrueを返します。- 戻り値:
- このループがすでに開始され、まだ
exit()メソッドで終了されていない場合はtrue、それ以外の場合はfalse
-