Java队列之Queue用法实例分析
什么是队列?
队列是一种特殊的线性数据结构,按照先进先出(First In First Out,FIFO)的原则存储数据,在队列的一端添加数据,在另一端删除数据,有点像排队买东西,先来的先买,后来的后买。
在Java中,队列的实现方式是使用Queue接口,Queue是Java中表示队列的接口,它继承了Collection接口,并在这个基础上添加了一些额外方法。
Queue的特性
- 元素只能在队尾添加,只能在队首删除。
- Queue只允许youpeek操作(查询队头元素),而不允许遍历整个队列。
- 支持同步,可以作为多线程环境中的任务队列使用。
如何使用Queue?
- 创建一个Queue实例,可以使用Java中已经实现的类LinkedList作为队列。
Queue<String> queue=new LinkedList<>();
- 添加元素:
queue.offer("a"); // 添加元素a
queue.offer("b"); // 添加元素b
queue.offer("c"); // 添加元素c
- 删除元素:
queue.poll(); // 删除队头元素a
- 查询元素:
queue.peek(); // 查询队头元素,返回b
示例说明
示例1:使用Queue求解迷宫问题
队列可以很方便地求解迷宫问题。我们可以将每一个位置看作一个节点,将节点放入队列中,并进行遍历找出终点。
public static void bfs(int[][] maze, int startX, int startY, int endX, int endY) {
Queue<Point> queue = new LinkedList<>();
queue.offer(new Point(startX, startY, null));
Set<Point> visited = new HashSet<>();
while (!queue.isEmpty()) {
Point point = queue.poll();
if (point.x == endX && point.y == endY) {
printPath(point);
return;
}
visited.add(point);
for (Point next : getNexts(maze, point)) {
if (!visited.contains(next)) {
queue.offer(next);
}
}
}
}
示例2:使用Queue实现线程池
线程池可以通过阻塞队列实现。当线程池中所有线程都在执行任务时,新任务需要等待,此时新任务可以被添加到阻塞队列中,等待有空闲的线程执行。
public class ThreadPool {
private int coreSize;
private int maxSize;
private BlockingQueue<Runnable> queue;
public ThreadPool(int coreSize, int maxSize, int queueSize) {
this.coreSize = coreSize;
this.maxSize = maxSize;
this.queue = new ArrayBlockingQueue<>(queueSize);
init();
}
private void init() {
for (int i = 0; i < coreSize; i++) {
new Thread(() -> {
while (true) {
try {
Runnable task = queue.take();
task.run();
} catch (InterruptedException e) {
break;
}
}
}).start();
}
}
public void submit(Runnable task) throws InterruptedException {
if (queue.size() == maxSize) {
throw new RuntimeException("queue is full");
}
queue.put(task);
}
}
以上示例仅为Queue使用的两个简单的例子,Queue在实际应用中有着更加广泛和深入的应用场景。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java队列之queue用法实例分析 - Python技术站