Java アプリケーションを閉じようとしていますが、スレッドが開いたままになっています。
デフォルトのWindows xボタンを使用して閉じるをクリックすると、すべてが正常に終了します(おそらくEXIT_ON_CLOSEが原因ですか?)-しかし、プログラムボタンを使用すると、thread.join()でハングします。
さらに悪いことに、ウィンドウは正常に処理されているため、ユーザーはウィンドウが閉じていると思いますが、開いたままの AWT スレッドがいくつかあります。私のメイン スレッドは ID が 20 のスレッドを待機していますが、スレッド ID を取得する方法がわかりません。
誰か提案はありますか?
これが私の終了コードです:
public synchronized void stop() {
running = false;
frame.dispose();
WindowEvent wev = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
try {
if (server != null) {
server.exit();
}
client.exit();
thread.join();
new Thread(){
public void run() {
System.exit(0);
}
}.start();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
System.exit(1);
}
}
終了後に開いているスレッドは次のとおりです。
run()
ここに私のメソッドの内容があります:
public void run() {
requestFocus();
while (running) {
getTimer().tick();
if (System.currentTimeMillis() - getTimer().getSecond() > 1000) {
// every second, add a second, print fps and mod title with fps
getTimer().accumulateSecond();
//System.out.println(getTimer().returnFPS());
frame.setTitle(title + " | " + getTimer().returnFPS());
getTimer().resetTick();
ticker++;
}
while (getTimer().getDelta() >= 1) {
// every time delta goes greater than one, update and supertick
update();
getTimer().superTick();
}
if (getTimer().getFPS() > 100) {
try {
Thread.sleep(5);
} catch (Exception e) {
System.err.println("Sleeping failed: " + e);
}
}
render();
if (ticker > 30) {
ticker = 0;
getTimer().hourTick();
}
}
stop();
}