我试图让我的 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();
}