Как синхронизировать две взлетно-посадочные полосы, чтобы самолеты могли приземляться с использованием Java? - PullRequest
0 голосов
/ 13 июля 2010

Кажется, у меня небольшая проблема. У меня есть приложение управления воздушным движением с двумя взлетно-посадочными полосами , которое я должен синхронизировать в Java. Это должно быть сделано, потому что, если есть самолет два , который приземляется, в то время как самолет один находится в процессе приземления, он (самолет два) не должен ждать, но может быстро перейти на ВПП два, чтобы приземлиться.

Я успешно синхронизировал одну взлетно-посадочную полосу и использую одну ArrayList для хранения сведений о самолете и посадочных работах, однако посадка второго самолета должна будет ждать (около 5 секунд). Есть идеи, как синхронизировать две взлетно-посадочные полосы?

Моя настоящая идея состояла в том, чтобы иметь два ArrayLists (один ArrayList(Even) хранит четные плоскости, например, плоскость два, плоскость четыре), а другой ArrayList(Odd) хранит нечетные плоскости, например. самолет один, самолет три. Затем я могу настроить ArrayList (Even) для работы на ВПП-1 и ArrayList (Odd) для работы на ВПП-2 (используя технику индивидуальной синхронизации, которую я применил для ВПП-1). Недостатком является то, что, если я добавлю 2 нечетных самолета в ArrayList Odd и 20 четных самолетов в ArrayList, когда взлетно-посадочная полоса 2 станет свободной, она не будет использоваться. Вместо этого будет использоваться только одна ВПП, и самолеты с четными номерами должны будут ждать.

Примечание: Я понимаю, что если обе взлетно-посадочные полосы заняты, третьему самолету придется подождать, но это приемлемо в соответствии с маркировочной схемой.

Есть предложения?

Спасибо

Ответы [ 4 ]

3 голосов
/ 13 июля 2010

Чтобы сделать это правильно, вам нужно иметь только одну очередь, в которую вы помещаете входящий самолет.Java обеспечивает реализацию очереди, и я предлагаю вам использовать ее, а не использовать собственную.

Как только вы настроите очередь, вам понадобятся два объекта ВПП и «авиадиспетчер».Авиадиспетчер отвечает за проверку взлетно-посадочных полос и, если таковая имеется, высовывает самолет из очереди и говорит ему приземлиться.

1 голос
/ 13 июля 2010

То, что вы хотите сделать, - это чтобы каждый самолет получил разрешение на использование взлетно-посадочной полосы, когда это необходимо для посадки / взлета.Есть два способа сделать это.

Если важно знать ВПП: Сделайте ВПП объектом и поместите его в пул ВПП.Например, поместите все Взлетно-посадочные полосы для Аэропорта в BlockingQueue , который принадлежит Аэропорту.Когда самолету нужна взлетно-посадочная полоса, он может вызвать BlockingQueue.take () для ее приобретения.Когда самолет завершает работу с ВПП, он должен вызвать BlockingQueue.put (), чтобы освободить его для использования другой плоскостью.

Если вам не важно, какая ВПП: используйте Семафор отслеживать количество доступных ВПП.Каждый самолет должен будет приобрести и выпустить Семафор.

1 голос
/ 13 июля 2010

Вам нужен счетный семафор со значением 2. Когда кто-то желает приземлиться, он потребляет 1 из семафора.Когда у них есть семафор, они могут выбрать, на какую взлетно-посадочную полосу приземлиться (просто проверьте состояние взлетно-посадочной полосы и выберите свободную).

Если семафор имеет значение 0, то людям придется подождать,Им даже не нужно смотреть на взлетно-посадочные полосы.

Когда самолет покидает взлетно-посадочную полосу, они освобождают семафор.

Документы Java на Семафор содержат подробности.

0 голосов
/ 13 июля 2010

Почему бы просто не иметь один объект Tower с методами requestLand () и reportClear (), а просто сохранить состояние ВПП в виде массива внутри Tower.

Есть ли еще одно требование, которое я пропускаю?

Не понимаете назначение двух списков массивов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...