Как исправить многопоточную программу из бесконечного цикла - PullRequest
0 голосов
/ 07 октября 2019

Я сделал программу для задания, которая аналогична проблеме суши из маленькой книги семафоров, и я борюсь с циклом, который используется для увеличения тактового сигнала, который по какой-то причине повторяется без выполнениядругие части кода.

Я пытался перевести поток в спящий режим на случай, если это было связано с слишком быстрым увеличением часов, я также пытался включить код семафора и мьютекса вкласс 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 + прибывает + сидит + уходит

...