Как использовать монитор из класса Java Thread [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как использовать монитор из класса Java Thread [закрыто]

Сообщение Anonymous »

Мне сложно реализовать логику параллельной разработки, основанную на теории операционных систем. Я не знаю, как погрузиться в свою работу, чтобы завершить ее в правильном решении, я знаю, что это когда-либо будет класс Monitor, основной класс, который аналогичен Thread0 или процессу Father в потоке, но для управления потоками, которые одновременно, чтобы предоставить доступ к ресурсу Shered, я столкнулся с некоторой проблемой. Рассмотрим пример возможного использования:
В природном парке есть несколько природных троп, по которым можно ездить на велосипеде. Для этого действует бесплатная услуга проката велосипедов, доступная для посетителей парка. В прокате пользователям предоставляется набор из N велосипедов, эквивалентных друг другу; велосипеды можно получить (с залогом 10 евро за велосипед) и вернуть на 3 станциях (A, B, C).
Каждая станция:
Имеет ограниченную вместимость парковки для велосипедов, равную Max (которая выражает максимальное количество велосипедов, которые можно оставить на станции), за пределами которой невозможно припарковать дополнительные велосипеды;
Оборудован собственный кассовый аппарат, куда вносятся денежные депозиты за велосипеды, полученные на станции.
В частности, существует два типа пользователей услуги:
Одинокие: доступ к прокат, чтобы получить только один велосипед за раз.
Пары посетителей: войдите в прокат, чтобы получить два велосипеда одновременно.
Каждый пользователь проката (один или пара) будет вести себя следующим образом:
Запросит желаемый велосипед/ы на начальной станции (A, B или C) и одновременно заплатит залог в размере 10 евро/велосипед;
Будет использовать велосипед/ы на произвольное время;
Вернет велосипед/ы на любой станции прибытия (A, B или C) и при этом получит возврат внесенного залога (10 евро/велосипед); в случае, если в кассе станции прибытия недостаточно суммы для возврата, пользователь ждет.
Для управления прокатом разработать параллельное приложение на Java на основе монитора, в котором работают пользователи представлены отдельными нитями.
Политика должна учитывать все указанные ограничения, а также:
Для приобретения велосипедов, приоритет придется отдавать одиноким пользователям.
Что касается возврата велосипедов, приоритет придется отдавать парам.
У кого-нибудь были идеи по поводу управления entrQueues( ) и waitQueues() со всеми условиями и сигналами? Ах, я помню, что это может быть написано на Java
Это моя проблема с фокусировкой, я должен создать класс, очень похожий на этот; но я не знаю, как адаптировать это в моем случае:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Monitor {
// costanti:
private final int IN=0;
private final int OUT=1;
//variabili di stato della sala:
private boolean PresenzaUsc=false; //Usciere Presente
private boolean ClosingMeeting=false; // riunione terminata (settato da usciere a fine riunione)
private int VisIN=0; //visitatori IN SALA
private int DipIn=0; // dipendenti in SALA (comprende anche l'Usciere)
private int N; //capacità sala
//sincronizzazione:
private Lock lock;
private Condition []codaU=new Condition[2]; //attesa Usciere [IN, OUT]
private Condition codaD; //attesa dipendenti
private Condition codaV; //attesa visitatori
private int []sospU=new int[2]; //usciere in attesa [IN, OUT]
private int sospD=0; //dipendenti in attesa
private int sospV=0; //visitatori in attesa

public Monitor(int N) {
this.N = N;
lock = new ReentrantLock();
for (int i=0; i0)
codaV.signalAll();

System.out.println("Usciere " + Thread.currentThread().getId() + " è uscito dalla sala: riunione conclusa");

}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}

public void EntraSalaVis() {
lock.lock();
try {
while( PresenzaUsc || VisIN==N || sospU[IN]>0 || sospD>0) {
sospV++;
codaV.await();
sospV--;
}

VisIN++;

System.out.println("Visitatore " + Thread.currentThread().getId() + " è entrato in sala");

}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}

}

public void EsceSalaVis() {
lock.lock();
try {
VisIN--;
if (VisIN==0 && sospU[IN]>0) // l'ultimo visitatore sblocca l'usciere in entrata
codaU[IN].signal();
System.out.println("Visitatore " + Thread.currentThread().getId() + " è uscito dalla sala");

}finally {
lock.unlock();
}

}

}



Подробнее здесь: https://stackoverflow.com/questions/787 ... read-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»