-1

在操场上,有两排孩子在等待使用环形交叉路口——一个从北面向它,一个从南面向它。儿童只能从任一队列的前面进入环形交叉路口,并且只有在有可用空间的情况下才能进入(每次只能有一个孩子使用每个路段)。一旦进入环形交叉路口,他们会随机使用一段时间,然后随机向东或向西离开。然后他们在别处玩一段随机时间,然后随机重新进入南北队列,以此类推,无限循环。环形交叉路口顺时针旋转,排队的孩子将始终使用第一个出现的空间...... 使用 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();
    }
}

我到了这里,现在我迷路了!请协助

4

2 回答 2

0

您只为孩子们建模,而不是实际的环形交叉路口。我怀疑每个孩子都需要自己的线程,除非这是强制性的。

似乎更有用的方法是创建三个线程,一个用于每个队列,一个用于回旋处。回旋处是工作线程,子队列是生产者线程。您的环形交叉路口线程将有一个循环缓冲区的孩子,每个孩子在进入环形交叉路口时都会随机决定一个“游戏时间”。该线程将定期检查每个孩子的“游戏时间”,当其中任何一个孩子过期时,它会将它们随机弹出到北方或南方队列中,并发出一个空间打开的信号量。

两个队列线程将各自等待信号量,每当信号量上升时,第一个获取信号量的线程会将其子线程放入环形交叉路口结构中,并随机选择“播放时间”。

或者,您可以让环形交叉路口线程随机将人们弹出到东部和西部游乐场,并让排队线程负责清空他们。您需要确保在同步方面正确处理每个共享集合(循环缓冲区和每个队列线程中的实际子级列表)。您只需要两个类,即迂回线程和队列线程,但会有两个队列线程实例,一个用于北,一个用于南。

于 2009-12-15T19:46:19.977 回答
0

信号量在哪里?其余的代码在哪里?如果这就是你所拥有的,我帮助你是不够的,感觉就像我在做所有的事情。

于 2009-12-16T19:29:00.737 回答