синхронизация потока Java с семафорами - PullRequest
0 голосов
/ 05 декабря 2018

У меня проблемы с завершением домашней работы, так что после нескольких часов попыток и поиска в Google и всего, что у меня нет другого выбора, кроме как обратиться сюда за помощью.У меня есть этот кусок кода (это не вся программа, есть также некоторые классы и пакеты, которые графически имитируют, как этот код работает, но я думаю, что размещать его здесь не обязательно):

public class KidsAndTramboline {

 private Tramboline tramboline = new Tramboline(300, 5);

 private class Tramboline {

  private Semaphore[] mutexes;
  private int[] counters;
  private Semaphore free;
  private Semaphore weight;
  private Semaphore kids;

  public Tramboline(int maxWeight, int maxKids) {
   mutexes = new Semaphore[] {
     new Semaphore(1),
     new Semaphore(1)
   };
   counters = new int[] {
     0,
     0
   };
   free = new Semaphore(1);
   weight = new Semaphore(maxWeight);
   kids = new Semaphore(maxKids);
  }

  public void getOn(Kid kid) {

   int sex = kid.sex == Sex.MALE ? 1 : 0;

   mutexes[sex].acquireUninterruptibly();
   counters[sex]++;
   if (counters[sex] == 1) {
    free.acquireUninterruptibly();
   }
   mutexes[sex].release();

   weight.acquireUninterruptibly(kid.weight);

   kids.acquireUninterruptibly(1);

  }

  public void getOff(Kid kid) {

   int sex = kid.sex == Sex.MALE ? 1 : 0;

   mutexes[sex].acquireUninterruptibly();
   counters[sex]--;
   if (counters[sex] == 0) {
    free.release();
   }
   mutexes[sex].release();

   weight.release(kid.weight);

   kids.release(1);;

  }
 }

 private class Kid extends UtilThread {

     private final Sex sex = getSex();
     private final int weight = getWeight();

        @Override
        protected void step() {
            resting();
         tramboline.getOn(this);
            try {
                jumping();
            } finally {
    tramboline.getOff(this);
   }
        }
    }

 private enum Sex {
  MALE, FEMALE;
 }
}

Это какая-то проблема с читателями и писателями, только с детьми и с батутом.Дело в том, что когда мальчики прыгают, девочкам приходится ждать и наоборот.Что я должен сделать здесь, так это когда мальчики и девочки ждут вместе (трамблин пуст), девочкам следует отдавать приоритет, чтобы они ладили раньше, чем мальчики.Можете ли вы помочь мне решить эту проблему?Спасибо.

...