如何销毁线程?

时间:2013-11-28 17:44:16

标签: java multithreading

我正在制作简单的游戏,这是代码:

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,因为它的速度更快,可能我需要杀死线程,但我不知道如何,谢谢

3 个答案:

答案 0 :(得分:2)

简单,打破循环:

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

结束循环,线程结束。

答案 1 :(得分:0)

终止线程的最简单方法是退出run函数。不需要特殊处理,只需要一个简单的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的任何进一步调用。

答案 2 :(得分:0)

不是真正的主题,但我也在制作游戏,而且我正在使用Timer(来自swingx):

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

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

对我很好。