目录
1.阻塞队列
1.1引言
1.2Java标准库中的阻塞队列
1.3自主通过Java代码实现一个阻塞队列(泛型实现)
2.生产者消费者模型
1.阻塞队列
1.1引言
阻塞队列是多线程部分一个重要的概念,它相比于一般队列,有两个特点:
1.线程是安全的
2.带有阻塞功能
1) 队列为空,出队列就会阻塞,阻塞到其它线程入队列为止
2)队列未满,入队列就会出现阻塞,阻塞到其它线程出队列为止
1.2Java标准库中的阻塞队列
-
ArrayBlockingQueue
是一个固定大小的阻塞队列,底层采用数组实现。当队列已经满时,插入操作将被阻塞,直到队列中有元素被取出。当队列为空时,取出操作将被阻塞,直到队列中有新元素加入。因为队列的大小是固定的,所以可以在队列未满时进行批量插入操作。 -
LinkedBlockingQueue
是一个可以无限扩容的阻塞队列,底层采用链表实现。与ArrayBlockingQueue
不同,当队列满时,插入操作将被阻塞,直到有其他线程移除了队列中的元素。与ArrayBlockingQueue
不同,这个队列的大小是动态变化的。 -
PriorityBlockingQueue
是一个基于优先级的阻塞队列,底层采用堆数据结构实现。每次出队的元素都是优先级最高的元素。队列中的元素必须是可比较的对象,即实现了Comparable
接口。与普通队列不同,PriorityBlockingQueue
不保证插入元素的顺序,而是保证在出队时优先级高的元素先出队。
1.3自主通过Java代码实现一个阻塞队列(泛型实现)
public class BlockingQueue <T> {
private Object[] array;
private int Size = 0;
private int head;
private int tail;
Object object = new Object();
public BlockingQueue(int capacity){
array = new Object[capacity];
}
//添加元素 如果满了就进入阻塞里面去
public void put( T t) throws InterruptedException {
synchronized (object) {
while (Size >= array.length) {
object.wait();
}
array[tail] = t;
tail++;
Size++;
if (tail >= array.length) {
tail = 0;
}
object.notify();
}
}
//出队列,如果为0则添加到阻塞队列里去
public T take() throws InterruptedException {
T t = null;
synchronized (object) {
while (Size == 0) {
object.wait();
}
t = (T) array[head];
head++;
if (head >= array.length) {
head = 0;
}
Size--;
object.notify();
return t;
}
}
}
2.生产者消费者模型
2.1实际应用场景
在实际开发中,经常会用到分布式系统,服务器整个功能不是由一个服务器全部完成的,而是每个服务器负责一部分功能,通过服务器的网络通信,最终完成整个功能.
但是这样的话,入口服务器和用户服务器还有商品服务器之间的耦合就过大了,一旦后两个服务器出现问题,极有可能影响到入口服务器.
这样可以做到解耦合