运行线程并控制它们

时间:2015-02-10 20:23:36

标签: java multithreading

我需要帮助弄清楚如何编码我遇到的这个问题。

我正在创建一个电梯模拟器。我想在单独的单个线程中运行每个Elevator对象。我想用ElevatorController对象来控制它们。我想象Elevator线程坐在IDLE中,然后在ElevatorController告诉它时切换到UP或DOWN。

我创建了Elevators并将它们放入存储在Building对象中的ArrayList中。

接下来我该怎么办?我的目标是让电梯1转到11楼。当电梯1移动时,我需要告诉电梯2去14楼。当电梯2移动到14楼时,我需要告诉它首先去13楼。

我不确定我应该如何创建这些线程并仍然在这些线程中引用电梯对象,所以我可以告诉它们新目的地。

我是多线程的新手。

1 个答案:

答案 0 :(得分:0)

将每个帖子定义为building中的字段,以便日后访问。我会做类似的事情:

public class ElevatorThread extends Thread {
    public void run() {
        while(!this.interrupted()) {
            synchronized(this) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    return;
                }
            }
            elevatorThreadRunnable.run();
        }
    }
    Runnable elevatorThreadRunnable;
    public void setRunnable(Runnable runnable) {
        elevatorThreadRunnable = runnable;
        synchronized (this) {
            this.notify();
        }
    }
}

如果我们将ElevatorThread s定义为数组,则会更容易。我们可以简单地说:

building.elevatorThreads[0].setRunnable(new Runnable() {
    public void run() {
        ...
    }
});

其中:

//I belong in the Building constructor!
Thread[] elevatorThreads = {
    new ElevatorThread(),
    new ElevatorThread(),
    new ElevatorThread()
    //number of elevators in building
    /*
        this could be simplified to a method that takes the number of threads as an int
        and returns an inflated array, but that is outside the context of this answer
    */
};

如果我们这样做,我们的Runnable将在您选择的电梯线程中运行。该线程也将按照您的请求进行空闲,直到设置了新的Runnable为止。

要杀死一个线程,我们调用ElevatorThread.interrupt();,这将导致线程停止wait(),如果是,然后突破我们的执行循环;杀死线程。