从多个 BlockingQueue 消费
Consuming from more than one BlockingQueue
我正在尝试实现包含电梯 class 的电梯系统,该电梯接受来自 ElevatorController 的请求并相应地移动。 ElevatorController 维护 2 个阻塞队列,一个用于向上请求,另一个用于向下请求。
我希望电梯查看两个队列并在其中一个队列中出现任何请求时提供服务。
如果我使用 upwardQueue.take()
,电梯将等待一些请求出现在 upwardQueue 中。但是同时,如果一个请求出现在downwardQueue中,电梯怎么消费呢?
基本上,电梯如何消费来自两个队列的请求?
理想的解决方案是创建一个 class 专门用于请求。
public class FloorRequest {
private final int floor;
private final Direction direction;
public FloorRequest(int floor, Direction direction) {
this.floor = floor;
this.direction = direction;
}
public int getFloor() { return floor; }
public Direction getDirection() { return direction; }
public enum Direction {
UP, DOWN
}
}
那么您将使用 单个 BlockingQueue
个 FloorRequest
元素。
BlockingQueue<FloorRequest> queue = ...;
while (/* some condition */) {
FloorRequest request = queue.take();
switch (request.getDirection()) {
case UP:
// do something
break;
case DOWN:
// do something else
break;
}
}
我正在尝试实现包含电梯 class 的电梯系统,该电梯接受来自 ElevatorController 的请求并相应地移动。 ElevatorController 维护 2 个阻塞队列,一个用于向上请求,另一个用于向下请求。
我希望电梯查看两个队列并在其中一个队列中出现任何请求时提供服务。
如果我使用 upwardQueue.take()
,电梯将等待一些请求出现在 upwardQueue 中。但是同时,如果一个请求出现在downwardQueue中,电梯怎么消费呢?
基本上,电梯如何消费来自两个队列的请求?
理想的解决方案是创建一个 class 专门用于请求。
public class FloorRequest {
private final int floor;
private final Direction direction;
public FloorRequest(int floor, Direction direction) {
this.floor = floor;
this.direction = direction;
}
public int getFloor() { return floor; }
public Direction getDirection() { return direction; }
public enum Direction {
UP, DOWN
}
}
那么您将使用 单个 BlockingQueue
个 FloorRequest
元素。
BlockingQueue<FloorRequest> queue = ...;
while (/* some condition */) {
FloorRequest request = queue.take();
switch (request.getDirection()) {
case UP:
// do something
break;
case DOWN:
// do something else
break;
}
}