Java-программирование с использованием семафоров и общих переменных - PullRequest
0 голосов
/ 20 апреля 2011

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

Доска объявлений (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, и это будет работать.Как получилось?

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Как правило, я не люблю напрямую отвечать на домашние вопросы, но вы можете сосредоточить свое исследование на классе Random с его методом nextInt(int), интерфейс List<T> и его реализации, интерфейс Runnable (и класс Thread) и Semaphore класс с его tryAcquire() и release() методами).

0 голосов
/ 20 апреля 2011

Одним из подходов может быть представление каждого уведомления об аренде как имеющего Семафор для количества доступных вкладок.

Семафоры - это в основном способ объявления о наличии ограниченного количества ресурсов.Когда процесс пытается получить семафор, он в основном запрашивает разрешение на использование ресурса, который символически защищает семафор.Когда процесс, получивший разрешение, выполняется с ресурсом, он должен разблокировать разрешение, чтобы другой процесс мог его получить.Если процесс хочет дождаться (возможно, навсегда) разрешения, доступного в Java, он вызывает Semaphore.acquire().Если процесс просто хочет попытаться получить разрешение, если оно сразу доступно, или сделать что-то еще, в Java он вызывает Semaphore.tryAcquire().

0 голосов
/ 20 апреля 2011

Я бы предложил написать это серийно (то есть по одному студенту за раз) только для того, чтобы ваши основные объекты / методы / алгоритмы работали должным образом. Это должно быть относительно просто для вас. Затем вернитесь, когда начнете рефакторинг для параллелизма, и задайте соответствующие вопросы.

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