我在这里提出另一个我正在解决但却无法解决的逻辑问题!
我在这里上课:
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是一个摆动框架)工作正常,但计时器的程序全部卡住了,我是否犯了任何逻辑错误,或者认为计时器错了?
我想事先感谢你阅读本文。
答案 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构造让主线程知道何时恢复。