2013-11-28 108 views
1

我正在做簡單的遊戲,這裏是代碼:如何銷燬一個線程?

public class Game extends Canvas implements Runnable { 


public void start() { 
    t = new Thread(this); 
    t.start(); 
} 

@Override 
public void run() { 
    setVisible(true); // visibility of the thread turn on 

    while (!t.isInterrupted()) { 
     if(condition for end the game) { 
      t.interrupt(); //here i need to destroy the thread 
      setVisible(false); //visibility to off 
     } 
     update(); 
     render(); 
     try { 
      Thread.sleep(20); 
     } catch(InterruptedException e) {} 
    } 
} 

} 

我有延伸JFrame的另一個和這個類推出主菜單,如果我的「條件結束的遊戲」是真實的,線程消失和菜單是可見的,它的好,但如果我想再次開始新的遊戲,線程的行爲是奇怪的 - 它看起來像Thread.sleep()方法從20更改爲10,因爲它的所有更快,也許我需要殺死線程,但我不知道怎麼了,感謝

回答

2

簡單,打破循環:

if(condition for end the game) { 
     t.interrupt(); //here i need to destroy the thread 
     setVisible(false); //visibility to off 
     break; 
    } 

您結束循環並且線程將結束。

+4

'break'不是一個好的選擇,因爲它只跳出當前循環。如果你有嵌套循環,你只會升一級,但不在線程之外。回報比較好。 – TwoThe

0

終止線程的最簡單方法是退出運行功能。沒有特殊的處理要求,一個簡單的return伎倆。

對你有興趣,你可能要考慮使用ScheduledExecutorService,它允許你安排一個Runnable以固定的速度運行:

executor.scheduleAtFixedRate(gameLoop, 0, 1000/TARGET_FPS, TimeUnit.MILLISECONDS); 

請記住,你再需要拿出實際的循環您gameLoop的,因爲這是由固定利率通話,將其降低到完成:

public void run() { 
    if (pause == false) { 
    update(); 
    render(); 
    } 
} 

pause是一個布爾值,你應該出於某種原因想要把渲染上暫停了一段時間。

通過此設置,您可以簡單地通過調用executor.shutdown()來終止遊戲,然後再禁止任何對runnable的進一步調用。

0

沒有真正的話題,但我做了一個小遊戲,和起搏我使用的定時器(從swingx):

public class MainGameLoop implements ActionListener{ 
    Timer timer; 
    public static void main(...){ 
      timer = new Timer(10, this); 
     timer.start(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     ... 
    } 
} 

工作以及給我。