特点:阻塞队列,无界队列,当然也可以在初始化时指定长度,会自动扩容。有优先级的概念是这个队列的特点。采用的是升序,比如1先入对,2后入队,出队时2会先出队。当然这是可以自己改变的,重写compareTo方法即可。
应用场景:这个队列还是比较常用的,比如发短信,通知短信和验证码短信,一般验证码短信要最快发到客户手中,通知类可以慢一点无碍,有验证码短信优先发送。
代码案例:
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,所以这两方法效果都是一样的。
take()还有poll()这两个方法和其他队列一样的,用poll需要添加参数,如果不添加参数就是不等待直接获取,获取不到就是null值。如果有参数表示在规定时间内等待,在等待时间内有put操作则马上返回值,超过规定时间无put操作就返回null。
转载于:https://my.oschina.net/uwith/blog/3057856