对于多线程间的数据共享,可以使用阻塞队列(BlockingQueue)来实现,它为我们自动管理多线程环境下的等待与唤醒问题,让程序员可以忽略这些细节,专注于高层次的业务功能。
会抛出异常的方法:
add(添加一个元素)、element(返回队列的头元素)、remove(移出并返回头元素)
会阻塞的方法:
put(添加一个元素)、take(移出并返回头元素)
不抛出异常不阻塞只改变返回值的方法:offer(添加一个元素并返回true,可带超时参数)、peek(返回队列的头元素)、poll(移出并返回队列的头元素 ,可带超时参数)
以下是BlockingQueue家族的成员:
1.ArrayBlockingQueue
基于数组实现,声明时要指明容量,入队/出队操作共用一个锁,无法做到严格意义上的并行, 默认为非公平模式。
2.LinkedBlockingQueue
基于链表实现,声明时若不指定容量,则默认容量为Integer.MAX_VALUE,接近无限大,运行时有耗尽内存的风险。入队/出队操作用两个锁,可以并行,提高了性能。
3.DelayQueue
无大小限制,只有队列中元素的延迟时间到了,才能获取到该元素。
4.PriorityBlockingQueue
无大小限制,优先级的判断通过构造函数传入的Compator对象来决定。
5.SynchronousQueue
无缓冲队列,默认为非公平模式。