Java семафор север юг кв - PullRequest
       18

Java семафор север юг кв

0 голосов
/ 15 декабря 2009

Есть две очереди детей, которые ждут, чтобы воспользоваться кольцевой развязкой на детской площадке - одна смотрит на нее с севера, другая с юга. Дети могут входить в кольцевую развязку только с начала любой очереди и могут входить только при наличии свободного места (только один ребенок может использовать каждый сегмент за раз). Оказавшись на кольцевой развязке, они используют ее в течение произвольного периода времени, а затем отправляются на восток или запад наугад. Затем они играют в другом месте в течение случайного периода и, после этого, возвращаются в очередь на север / юг наугад, и так до бесконечности. Карусель вращается по часовой стрелке, и ребенок в очереди всегда будет использовать первое пробел, который идет вместе ... Напишите программу, использующую семафоры Java, для синхронизации доступа к общему обходному объекту с помощью набора процессов, представляющих дочерние элементы.

Вот что я сделал до сих пор, и не знаю, что делать дальше. Что я делаю в основном классе?

import java.util.Random;

public class Child extends Thread {
    private Random  random;
    private int     which;
    private int     number;

    public Child(int number) {
        this.number = number;
        random = new Random();
        this.which = random.nextInt(2);
    }

    public void run() {
    //start point?
    }

    public int getNumber() {
        return number;
    }

    private void checkQuePosition() {
        if (atFront()) 
            tryToGetOn();
        else 
            checkQuePosition();
    }

    //returns true if at front of que, else false
    private boolean atFront() {
        int position;
        if (which == 0) 
            position = Playground.north.que.search(this);
        else
            position = Playground.south.que.search(this);
        return position == 1;
    }

    private void tryToGetOn() {
        Playground.roundabout.semaphore.acquire();
        //get into the roundabout somehow
    }

    //releases semaphore, sleeps for a random period then calls joinQue(random 0 or 1)
    public void getOff() {
        Playground.roundabout.semaphore.release();
        Thread.sleep(random.nextLong());
        joinQue(random.nextInt(2));
    }

    private void joinQue(int w) {
        this.which = w;
        if (w == 0) {
            //join north que
        }
        else
            ;//join south que
        checkQuePosition();
    }
}

Я попал сюда и теперь я потерян! Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 16 декабря 2009

Где семафоры? а где остальной код? если это все, что у тебя есть, мне недостаточно помочь тебе, я чувствую, что делаю все это.

0 голосов
/ 15 декабря 2009

Вы только смоделировали детей, а не фактическую кольцевую развязку. Я сомневаюсь, что каждому ребенку нужна своя нить, если она не обязательна.

То, что кажется более полезным, - это создать три потока, по одному для каждой очереди и один для кольцевой развязки. Карусель - это рабочий поток, а дочерние очереди - потоки производителя. В вашей кольцевой нити будет круговой буфер с детьми, у каждого из которых будет «время игры», которое определяется случайным образом при входе в кольцевую развязку. Поток будет периодически проверять «время игры» каждого дочернего элемента, а когда срок действия любого из них истечет, он случайным образом выбрасывает их в северную или южную очередь и поднимает семафор, в котором открыто пространство.

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

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

...