Java SE 8 デスクトップ アプリケーションを作成します。Swing UI を備えています。
プラットホーム:
- エクリプスIDE
- Windows 10 OS
右上隅の「X」を押してメインウィンドウを閉じると、そのようなイベントをリッスンするリスナーができます。
ここのリスナー:
private void listenerForClosingResources(){
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if(e.getID() == WindowEvent.WINDOW_CLOSING){
CountDownLatch continueOn = new CountDownLatch(1);
saveUnsavedTmpProject(continueOn);
try {
continueOn.await();
}
catch(InterruptedException ee) {
ee.printStackTrace();
}
}
}
});
}
そのため、リスナーを使用してウィンドウを閉じるイベントを識別し、それが発生したときに、プロジェクト (DB 上のデータ) を保存するかどうかをユーザーに尋ねます。
このメソッド ( saveUnsavedTmpProject(continueOn);
) は、プロジェクトを保存する名前を取るはずの別のウィンドウにつながります。
これでCountDownLatch
、ユーザーが他のパネルでプロジェクトの保存を確認/拒否するまで、メイン ウィンドウが強制的に表示されたままになります。
ウィンドウを作成してプロジェクトを保存する他のクラス メソッドは次のとおりです。
public static void getInstance(CountDownLatch continueOn, String openProjectName) {
if(frame == null) {
synchronized(SaveAsPane.class) {
if(frame == null) {
carryOn = continueOn;
if(!openProjectName.isEmpty()){
openProject = openProjectName;
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame = new SaveAsPane();
frame.setVisible(true);
frame.setLocationRelativeTo(MainGUI.getMainGUI());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
}
ここで、アプリを実行すると、run()メソッド内に入りません (ウィンドウがポップアップしません)。しかし、それは、上記のリスナーからのみこのメソッドにアクセスした場合にのみ発生します。がCountDownLatch
あり、新しいスレッドの実行を停止しているようです。
ユーザーがプロジェクトの保存を確認/拒否すると、ラッチがカウントダウンされるため、実行フローが続行されます。それでも、 に追加のスレッドを作成しますEventQueue
。
スレッドが停止するのはなぜですか?