Ванная Java для мужчин и женщин

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

Есть виды нитей: мужские и женские. Оба хотят использовать одни и те же ресурсы, количество которых равно BATHROOM_SIZE. 5 правил:

  1. Каждый поток, сигнализировавший о необходимости использования ресурса, должен ждать, пока он сможет его использовать.
  2. Предотвращение ситуации, когда более BATHOOM_SIZE потоков одновременно используют ресурс.
  3. Запрещается одновременное пользование ванной женщиной и мужчиной.
  4. Потоки должны использовать ресурсы одновременно. Если имеется много потоков одного типа, потоки до BATHROOM_SIZE должны использовать ресурс.
  5. Предотвратите голодание.

Результаты

Работает для:

1женщина, 1мужчина, 5женщин, 5мужчин

Не подходит для:

5женщин1мужчин, 5мужчин1женщин, 2мужчин2женщин, 5мужчин5женщин.

Я пытался заставить его работать с понедельника, и теперь у меня закончились идеи.

Код

Итак, моя задача состоит в том, чтобы написать класс Bath.java, который реализует BathInterface:

public interface BathroomInterface {

    public static final int BATHROOM_SIZE = 3; //3 is just example
    void manEnter();
    void manExit();
    void womanEnter();
    void womanExit();
}

В системе есть ряд мужских и женских потоков, которые работают как это:

for(int i = 0; i < n; i++) {
  bathroom.manEnter();
  //uses bathroom random amount of time
  bathroom.manExit();
}

for(int i = 0; i < m; i++) {
  bathroom.womanEnter();
  //uses bathroom random amount of time
  bathroom.womanExit();
}

У меня также есть схема класса Bath.java, я должен расширить:

import java.util.concurrent.Semaphore;

public class Bathroom implements BathroomInterface {


    private Semaphore mutex = new Semaphore(1, true);

    public void womanEnter() {
        mutex.acquireUninterruptibly();
    }

    public void womanExit() {
        mutex.release();
    }

    public void manEnter() {
        mutex.acquireUninterruptibly();        
    }

    public void manExit() {
        mutex.release();
    }
}

Вот что я сделал до сих пор:

import java.util.concurrent.Semaphore;

public class Bathroom implements BathroomInterface {
    int manW=0, manU=0, womanW=0, womanU=0; //*U-using, *W-waiting
    private Semaphore mutex = new Semaphore(1, false);

    public void womanEnter() {
        womanW++;
        StateChange();
    }

    public void womanExit() {
        womanU--;
        mutex.release();
        StateChange();
    }

    public void manEnter(){
        manW++;
        StateChange();
    }

    public void manExit() {
        manU--;
        mutex.release();
        StateChange();
    }

    void StateChange() {
        if(womanU==0 && manU==0) {
            if(manW>womanW) {
                while(manW>0 && manU<BATHROOM_SIZE) {
                    manW--;
                    manU++;
                    mutex.acquireUninterruptibly();
                }
            }
            else {
                while(womanW>0 && womanU<BATHROOM_SIZE) {
                    womanW--;
                    womanU++;
                    mutex.acquireUninterruptibly();
                }
            }
        }
        if(womanU==0 && manU<BATHROOM_SIZE) {
            while(manW>0 && manU<BATHROOM_SIZE) {
                manW--;
                manU++;
                mutex.acquireUninterruptibly();
            }
        }
        if(manU==0 && womanU<BATHROOM_SIZE) {
            while(womanW>0 && womanU<BATHROOM_SIZE) {
                womanW--;
                womanU++;
                mutex.acquireUninterruptibly();
            }
        }
    }
}
7
задан Bill the Lizard 18 September 2012 в 14:14
поделиться