特色:阻塞队列,无界队列,固然也能够在初始化时指定长度,会自动扩容。有优先级的概念是这个队列的特色。采用的是升序,好比1先入对,2后入队,出队时2会先出队。固然这是能够本身改变的,重写compareTo方法便可。java
应用场景:这个队列仍是比较经常使用的,好比发短信,通知短信和验证码短信,通常验证码短信要最快发到客户手中,通知类能够慢一点无碍,有验证码短信优先发送。web
代码案例:spring
package com.example.web.web; import lombok.Data; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; @RestController public class HomeController { @RequestMapping("/index") public String index() throws Exception { PriorityBlockingQueue<PriorityElement> queue = new PriorityBlockingQueue<>(); //生产者 new Thread(() -> { try { for (int i = 0; i < 5; i++) { PriorityElement priorityElement = new PriorityElement(); priorityElement.setAge(12); priorityElement.setName("haha" + (5 - i)); priorityElement.setPriority(5 - i); System.out.println("生产者begin"); queue.put(priorityElement); System.out.println("生产者end"); TimeUnit.SECONDS.sleep(3); } } catch (Exception ex) { System.out.println(ex); } }).start(); //消费者 new Thread(() -> { try { for (int i = 0; i < 5; i++) { //TimeUnit.MILLISECONDS.sleep(1000); System.out.println("消费者begin"); PriorityElement priorityElement = queue.take(); //PriorityElement priorityElement = queue.poll(1, TimeUnit.SECONDS); System.out.println("消费者end" + (priorityElement == null ? "null" : priorityElement.getName())); } } catch (Exception ex) { System.out.println(ex); } }).start(); //主线程也等待下 TimeUnit.SECONDS.sleep(20); return "网站已获得响应"; } } @Data class PriorityElement implements Comparable<PriorityElement> { private Integer priority; private String name; private Integer age; public int compareTo(PriorityElement priorityElement) { return this.priority.compareTo(priorityElement.priority); } }
添加方法除了put()还有offer(),因为队列长度无限制因此offer不会阻塞队列也不会返回false,因此这两方法效果都是同样的。app
take()还有poll()这两个方法和其余队列同样的,用poll须要添加参数,若是不添加参数就是不等待直接获取,获取不到就是null值。若是有参数表示在规定时间内等待,在等待时间内有put操做则立刻返回值,超过规定时间无put操做就返回null。网站