Java.util.timer循环,程序卡住(无限循环?)

时间:2013-11-11 20:08:08

标签: java timer

我在这里提出另一个我正在解决但却无法解决的逻辑问题!

我在这里上课:

package data;

import gui.GUIJuego;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import dominio.Adorno;
import dominio.EdificioNoPublico;
import dominio.EdificioPublico;
import dominio.Item;

public class Administrador {

private Ciudad ciudad;
private int contadorExplosion;
private boolean endofgame;
private Dificultad dificultad;
private Constructora constructora;

public Administrador(Ciudad ciudad, int contadorExplosion, boolean endofgame, Dificultad dificultad, Constructora constructora) {
    this.ciudad = ciudad;
    this.contadorExplosion = contadorExplosion;
    this.endofgame = endofgame;
    this.dificultad = dificultad;
    this.constructora = constructora;
}

public Administrador(){
    this.setCiudad(new Ciudad());
    this.setContadorExplosion(0);
    this.setEndofgame(false);
    this.setDificultad(new Dificultad(1));
    this.setConstructora(new Constructora());
}

public void administrar(final GUIJuego juego){

    Timer timer = new Timer("Juego");

    this.setEndofgame(false);

    while(endofgame == false){


        timer.scheduleAtFixedRate(new TimerTask(){
            public void run() {

                juego.getArcaLabel().setText("Arca: " + getCiudad().getArca());
                juego.getPuntosBellezaLabel().setText("Puntos de Belleza: " + getCiudad().getPuntosBelleza());
                juego.getHabitantesLabel().setText("Habitantes: " + getCiudad().getCantidadHabitantes() + " / " + getCiudad().getCantidadHabitantesDisponibles());
                getEgresosIngresos();
                tryExplotar();

            }

        }, 0, 1000);

    }

}

private void getEgresosIngresos(){

    for(Item i : this.getCiudad().getItems()){

        if(i.getContadorTiempo() == 89){

            i.setContadorTiempo(0);

            if(i instanceof EdificioNoPublico)
                this.getCiudad().setArca(this.getCiudad().getArca() + ((EdificioNoPublico) i).getRenta());
            else
                this.getCiudad().setArca(this.getCiudad().getArca() - getCostosAdornosEdificiosPublicos(i));

        } else { i.setContadorTiempo(i.getContadorTiempo() + 1); }
    }

}

private int getCostosAdornosEdificiosPublicos(Item i){

    if(i instanceof EdificioPublico)
        return ((EdificioPublico) i).getCostoMantenimiento();
    else if(i instanceof Adorno)
        return ((Adorno) i).getCostoMantenimiento();

    return 0;
}

private void tryExplotar(){

    if(this.getContadorExplosion() == 299 && this.getCiudad().getItems() != null){

        Random rnd = new Random();

        if(rnd.nextInt(100) < this.getCiudad().getProbabilidadExplosion() && this.getCiudad().getItems().size() > 0){
            this.getCiudad().getItems().remove( rnd.nextInt ( this.getCiudad().getItems().size() ) );
            this.setContadorExplosion(0);
        }

        rnd = null;

    }else{ this.setContadorExplosion(this.getContadorExplosion() + 1); }

}

// ### Getters y Setters ###

public Ciudad getCiudad() {
    return ciudad;
}

public void setCiudad(Ciudad ciudad) {
    this.ciudad = ciudad;
}

public int getContadorExplosion() {
    return contadorExplosion;
}

public void setContadorExplosion(int contadorExplosion) {
    this.contadorExplosion = contadorExplosion;
}

public boolean isEndofgame() {
    return endofgame;
}

public void setEndofgame(boolean endofgame) {
    this.endofgame = endofgame;
}


public Dificultad getDificultad() {
    return dificultad;
}

public void setDificultad(Dificultad dificultad) {
    this.dificultad = dificultad;
}

public Constructora getConstructora() {
    return constructora;
}

public void setConstructora(Constructora constructora) {
    this.constructora = constructora;
}

// ### Fin Getters y Setters ##
}

但是你们会感兴趣的是这种特殊的方法:

public void administrar(final GUIJuego juego){

    Timer timer = new Timer("Juego");

    this.setEndofgame(false);

    while(endofgame == false){


        timer.scheduleAtFixedRate(new TimerTask(){
            public void run() {

                juego.getArcaLabel().setText("Arca: " + getCiudad().getArca());
                juego.getPuntosBellezaLabel().setText("Puntos de Belleza: " + getCiudad().getPuntosBelleza());
                juego.getHabitantesLabel().setText("Habitantes: " + getCiudad().getCantidadHabitantes() + " / " + getCiudad().getCantidadHabitantesDisponibles());
                getEgresosIngresos();
                tryExplotar();

            }

        }, 0, 1000);

    }

}

现在,据我所知,调试器,定时器正在循环,我不完全确定它甚至试图在其中运行函数,我所知道的是框架(参数GUIJuego是一个摆动框架)工作正常,但计时器的程序全部卡住了,我是否犯了任何逻辑错误,或者认为计时器错了?

我想事先感谢你阅读本文。

1 个答案:

答案 0 :(得分:1)

您正在忙碌的while循环中调用timer.scheduleAtFixedRate。你很可能只想打电话一次。

当您使用TimerTask时,执行发生在另一个线程上。我不知道你是否真的需要另一个线程,但如果没有,那么做你想做的最简单的方法就是

while(!endOfGame) {
   juego.getArcaLabel().setText("Arca: " + getCiudad().getArca());
   juego.getPuntosBellezaLabel().setText("Puntos de Belleza: " + getCiudad().getPuntosBelleza());
   juego.getHabitantesLabel().setText("Habitantes: " + getCiudad().getCantidadHabitantes() + " / " + getCiudad().getCantidadHabitantesDisponibles());
   getEgresosIngresos();
   tryExplotar();

  Thread.sleep(1000);
}

如果确实需要在单独的线程中执行定时器,那么需要一个更好的方法来等待定时器线程完成执行而不是忙等待(while)循环。例如,您可以使用thead.join(),但是您必须显式创建计时器线程,而不是依赖于Timer内部逻辑。或者您可以在对象上进行同步并使用wait / notify构造让主线程知道何时恢复。