我試圖讓我的Java應用程序關閉,但線程仍處於打開狀態。無法在退出時關閉所有AWT線程
當使用默認的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();
}
移動'System.exit(0)'臨時紗線之上加入'()'工作完全關閉它,但我懷疑它是線程安全的? – gossfunkel
請問這是什麼原因,在這裏,是否可能是錯誤的, – mKorbel
您在上面的'stop()'方法所在的同一個類中的內部* Thread類中顯示的run()方法是什麼? 'run()'中是否有其他調用調用'synchronized'方法? – Nate