#java
#java
Вопрос:
У меня есть класс, представляющий различные ресурсы на планете. При создании экземпляра объекта из класса объект должен увеличивать количество ресурсов с постоянной скоростью. Скорость производства хранится в переменной и может быть изменена. Я ожидаю, что при изменении скорости производства фактическая скорость, с которой производятся ресурсы, должна измениться. Вот мой класс ресурсов:
public class PlanetResources implements ResourceObserver {
//baseProducingRate;
private final int SECONDSINHOUR =3600;
private final int mmBaseProducingRate =20;
private final int cBaseProducingRate = 15;
private final int dBaseProducingRate = 13;
private final int vBaseProducingRate = 15;
//Amount of resources of each type
private int metallicMicrolattice;
private int energy;
private int carbyne;
private int deuterium;
private int vibranium;
//Resources Producing rate
private int mmProducingRate=this.mmBaseProducingRate;
private int cProducingRate= this.cBaseProducingRate;
private int dProducingRate = this.dBaseProducingRate;
private int vProducingRate = this.vBaseProducingRate;
public PlanetResources(int mm, int e, int c, int d, int v) {
super();
this.metallicMicrolattice = mm;
this.energy = e;
this.carbyne = c;
this.deuterium = d;
this.vibranium = v;
int delay=2000;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
metallicMicrolattice ;
}
}, delay, this.SECONDSINHOUR*1000/this.getMmProducingRate());
timer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
carbyne ;
}
}, delay, this.SECONDSINHOUR*1000/this.cProducingRate);
}
Вот мои тестовые коды:
public static void main(String args[]) throws InterruptedException
{
PlanetResources thePlanetResource = new PlanetResources(0, 0, 0, 0, 0);
Scanner keyboard= new Scanner(System.in);
while(true)
{
System.out.println("Welcome, What would you like to do ?");
System.out.println("1) visit ship Yard");
System.out.println("2) visit mines");
System.out.println("3) manage fleet");
System.out.println("4) explore galaxy");
System.out.println("5) exit");
int option = keyboard.nextInt();
if (option==2)
{
System.out.println("Here are your current resources:");
System.out.println(thePlanetResource);
Thread.sleep(10000);
System.out.println(thePlanetResource);
thePlanetResource.setMmProducingRate(10000);
}
}
Когда я запустил его, я получаю:
Значение metallicMicrollatice должно увеличиваться намного быстрее после того, как я выберу 2 вторых раза (10000 / часов) в предоставленных параметрах. Но он по-прежнему выдавал только 1 через 10 секунд.
Комментарии:
1. В многопоточных системах вы должны использовать
AtomicInteger
для переменных вместоint
, используемых более чем в одном потоке (например, основной поток и поток таймера) вместо int. В противном случае вы можете столкнуться с проблемами.