面试题答案
一键面试设计思路
- 策略接口定义:定义一个接口,用于抽象优先级排序策略。不同的排序策略实现该接口,这样可以通过实现新的策略类来扩展优先级排序方式。
- 动态策略切换:在管理
PriorityBlockingQueue
的类中,设置一个成员变量来存储当前使用的排序策略,并提供方法来动态切换这个策略。 - 元素重新排序:当策略变更时,需要对队列中的元素重新排序。由于
PriorityBlockingQueue
是基于堆实现的,无法直接重新排序,一种方法是将队列元素全部取出,重新插入队列,利用队列的排序机制重新排序。
关键代码片段
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.concurrent.PriorityBlockingQueue;
// 事件对象
class Event {
private int priority1;
private int priority2;
// 其他属性
public Event(int priority1, int priority2) {
this.priority1 = priority1;
this.priority2 = priority2;
}
public int getPriority1() {
return priority1;
}
public int getPriority2() {
return priority2;
}
}
// 优先级排序策略接口
interface PriorityStrategy extends Comparator<Event> {
int compare(Event e1, Event e2);
}
// 基于priority1的排序策略
class Priority1Strategy implements PriorityStrategy {
@Override
public int compare(Event e1, Event e2) {
return Integer.compare(e1.getPriority1(), e2.getPriority1());
}
}
// 基于priority2的排序策略
class Priority2Strategy implements PriorityStrategy {
@Override
public int compare(Event e1, Event e2) {
return Integer.compare(e1.getPriority2(), e2.getPriority2());
}
}
// 管理PriorityBlockingQueue的类
class EventQueueManager {
private PriorityBlockingQueue<Event> eventQueue;
private PriorityStrategy currentStrategy;
public EventQueueManager(PriorityStrategy initialStrategy) {
this.currentStrategy = initialStrategy;
this.eventQueue = new PriorityBlockingQueue<>(11, currentStrategy);
}
// 动态切换排序策略
public void switchStrategy(PriorityStrategy newStrategy) {
this.currentStrategy = newStrategy;
reorderQueue();
}
// 重新排序队列
private void reorderQueue() {
PriorityQueue<Event> tempQueue = new PriorityQueue<>(eventQueue.size(), currentStrategy);
tempQueue.addAll(eventQueue);
eventQueue.clear();
eventQueue.addAll(tempQueue);
}
// 添加事件到队列
public void addEvent(Event event) {
eventQueue.add(event);
}
// 获取并移除队列头部元素
public Event pollEvent() {
return eventQueue.poll();
}
}
示例使用
public class Main {
public static void main(String[] args) {
PriorityStrategy initialStrategy = new Priority1Strategy();
EventQueueManager manager = new EventQueueManager(initialStrategy);
manager.addEvent(new Event(3, 5));
manager.addEvent(new Event(1, 4));
manager.addEvent(new Event(2, 6));
// 动态切换策略
manager.switchStrategy(new Priority2Strategy());
Event event;
while ((event = manager.pollEvent()) != null) {
System.out.println("Polled Event: priority1 = " + event.getPriority1() + ", priority2 = " + event.getPriority2());
}
}
}
上述代码通过定义优先级排序策略接口和实现不同策略类,实现了PriorityBlockingQueue
优先级排序策略的动态切换,并处理了策略变更时队列元素的重新排序问题。在高并发场景下,PriorityBlockingQueue
本身的线程安全机制可以保证队列操作的正确性,而通过合理的设计和优化(如尽量减少策略切换频率)可以保证较好的性能。