Я сделал программу для задания, которая аналогична проблеме суши из маленькой книги семафоров, и я борюсь с циклом, который используется для увеличения тактового сигнала, который по какой-то причине повторяется без выполнениядругие части кода.
Я пытался перевести поток в спящий режим на случай, если это было связано с слишком быстрым увеличением часов, я также пытался включить код семафора и мьютекса вкласс Parlor и класс Customer.
Соответствующий код класса Parlor
public void run()
{
while(allFinishedEating() == false)
{
for(int i = 0; i < customerList.size(); i++)
{
if(customerList.get(i).getArrives() == this.clock)
{
customerList.get(i).setParlour(this);
customerList.get(i).start();
}
}
try
{
Thread.sleep(1000);
}
catch(InterruptedException e) {}
System.out.println(clock);
this.clock += 1;
}
}
Соответствующий код класса Customer
public void run()
{
par.waitMutex();
if(par.getEating() == 4)
{
par.setWaiting(par.getWaiting() + 1);
par.signalMutex();
par.waitBlock();
}
par.setEating(par.getEating() + 1);
par.signalMutex();
this.sits = par.getClock();
int leaves = sits + eating_time;
System.out.println("code gets to while loop" + (par.getClock()));
while(par.getClock() < leaves)
{
}
this.leaves = leaves;
this.finished = true;
System.out.println(id + " "+ arrives + " " + sits + " " + leaves);
par.waitMutex();
par.setEating(par.getEating() - 1);
if(par.getEating() == 0)
{
int chairs = Math.min(4, par.getWaiting());
par.setWaiting(par.getWaiting() - chairs);
par.setEating(par.getEating() + chairs);
par.signalBlock(chairs);
}
par.signalMutex();
}
Выходное значение для каждого клиента должно быть
id + прибывает + сидит + уходит