Я пытаюсь закрыть свое Java-приложение, но потоки остаются открытыми.
При нажатии кнопки закрытия с помощью кнопки x по умолчанию в Windows все закрывается нормально (вероятно, из-за EXIT_ON_CLOSE?), Но когда я использую программную кнопку, она зависает на thread.join ().
Хуже того, окно расположено нормально, поэтому пользователь может подумать, что оно закрыто, но есть несколько потоков AWT, которые остаются открытыми. Мой основной поток ожидает потока с идентификатором 20, но я понятия не имею, как получить идентификаторы потока.
У кого-нибудь есть предложения?
Вот мой код выхода:
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();
}
System.exit(0)
временного потока вышеjoin()
позволяет полностью закрыть его, но я сомневаюсь, что это потокобезопасно? - person gossfunkel   schedule 31.05.2013run()
, который вы показываете во внутреннемThread
классе, в том же классе, что и методstop()
выше? Существуют ли какие-либо другие вызовы вrun()
, которые вызываютsynchronized
методы? - person Nate   schedule 02.06.2013