它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的。插入元素是追加到尾上。提取一个元素是从头提取。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。该队列不允许null元素
大致是这样的思路,用户请求接口 将用户的请求方到 ConcurrentLinkedQueue 中去。然后按照顺序一个一个 去处理用户的请求
主要用到了 几个方法
offer(E e)
将指定元素插入此队列的尾部。
poll()
获取并移除此队列的头,如果此队列为空,则返回 null。
isEmpty()
如果此队列不包含任何元素,则返回 true
添加和读取元素的 方法不多说。 很简单 , 完事是消费队列里的任务了
@PostConstruct
public void consumer() throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (!pullist.isEmpty()) {
Map<String, Object> map = (Map<String, Object>) pullist.poll();
try{
/*这里写业务逻辑*/
}catch (Exception e){
continue;
}
}
}
}
});
}
在controller 初始化的时候 开一个线程 ,去循环读取队列里的消息。 如果没有消息 就睡一会。
注意就是在判断队列是否为空的时候 不要使用.size 方法去获取长度完事判断是否为空。因为.size方法会遍历整个队列。 应该直接使用isEmpty 方法