Java并发使电梯停在附近的楼层

时间:2013-12-21 21:28:40

标签: java multithreading concurrency synchronized

因此,对于这项任务,我必须模拟电梯。 现在,我生成3个人,他们在一个随机的楼层上产生并且有一个随机的目的地楼层。 我有一台电梯可以把它们拿起并带上它们。 我遇到的问题是电梯一次可以处理1个人。 我不知道怎么做才能让电梯停在人们路上的地板上。 例如:

人1的起始楼层是3,并且是8 人2的起始楼层是9,并且是10 人3的起始楼层是6,并且要到9

目前的工作方式,电梯到3,然后到8,没有在第6层停在第3层。我不知道如何解决这个问题。

电梯在楼层之间移动的代码如下:

public void moveTo(int floor) throws InterruptedException
{
    int distance;

    synchronized(this)
    {
        distance = Math.abs(currentFloor - floor);
        System.out.println(name + " is on floor " + currentFloor + " moving to " + floor);
    }

    Thread.sleep(1000 * distance);

    synchronized(this)
    {
        currentFloor = floor;
    }
}

电梯的主要run()方法是:

public void run()
{
    try
    {
        for(;;)
        {
            ElevatorTask task;

            synchronized(this)
            {
                while(next_task == null)
                    wait();

                task = next_task;
                next_task = null;
                notify();
            }

            moveTo(task.getDestination());
        }
    }
    catch(InterruptedException ex){}
}

对此的任何帮助都会很棒。 感谢

2 个答案:

答案 0 :(得分:1)

想一想:

当您的电梯在地板旁边时,检查那里是否有人。如果是,请打开门,如果没有,请跳到下一层。

将所有人送到他们的楼层后,前往最近的楼层,那里有一个人叫电梯。

答案 1 :(得分:0)

好像你把moveTo(task.getDestination());置于错误的位置。 它应该在synchronized块中以及你的任务获取行为,否则它仍然可能多线程会调用你的moveTo方法。 希望它能帮助你!