Привет всем, у меня есть задание в школе, и я действительно не знаю, с чего начать.Я не хочу полное решение, а скорее советы и как начать с этим.Извините, но я новичок в программировании.Вот задача:
Доска объявлений (40p) используется для размещения уведомлений об аренде квартир.Каждое уведомление об аренде включает в себя 3 отрывные вкладки с номером телефона на нем.Группа русских студентов сканирует доску в поисках квартиры.Каждый студент случайным образом выбирает 3 разные квартиры и пытается удалить одну вкладку из каждого из 3 соответствующих уведомлений.Если ученику удается взять 3 выбранные вкладки, он уходит, в противном случае он не берет, приостанавливает случайное количество времени, а затем снова пытается выбрать новую 3 квартиры.Симуляция заканчивается, когда все студенты уехали.Предположим, на доске есть место для сводок (n / 3) уведомлений.Разработайте параллельную программу, которая имитирует действия учащихся, используя только семафоры для синхронизации.Представлять студентов как параллельные процессы.Обязательно объявите и инициализируйте общие переменные, которые вы используете для взаимодействия и синхронизации процессов.Попробуйте максимизировать параллелизм.Кратко объясните, как работает ваше решение и как избежать тупика.
Обновление включает информацию, предоставленную в виде ответа
Вот мой код!Я в правильном направлении!?
private static Semaphore[] apartments;
public void setApartments()
{
apartments = new Semaphore[3];
for(int i = 0; i < 3; i++)
apartments[i] = new Semaphore(3);
}
@Override
public void run()
{
setApartments();
Random random = new Random();
while(counter < 3)
{
try
{
acquired = apartments[random.nextInt(3)].tryAcquire();
if(acquired)
System.out.println("Student" + id + " succeded.");
else
System.out.println("Student" + id + " failed.");
counter++;
}
catch(Exception e) {e.printStackTrace();}
}
}
У меня есть одна проблема, которую я не могу понять.У меня одновременно запущено 4 потока, которые говорят по одному разрешению за раз: статический семафор tabsA = новый семафор (3);
Так что я буду работать вечно, потому что он не получит.Но если я использую tabsA.release ();когда поток не удовлетворяет требованиям, все четыре потока могут получать разрешения, даже если в Semaphore (3) есть 3 разрешения.Я мог бы даже запустить 10 threds, и это будет работать.Как получилось?