0

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

我这里有这门课:

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 是一个摆动框架)工作正常,但是计时器让程序全部卡住,我是否犯了任何逻辑错误,或者认为计时器错误?

预先感谢您阅读本文。

4

1 回答 1

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 内部逻辑。或者您可以在对象上进行同步并使用等待/通知结构让主线程知道何时恢复。

于 2013-11-11T20:15:55.047 回答