java并发队列之PriorityBlockingQueue

特点:阻塞队列,无界队列,当然也可以在初始化时指定长度,会自动扩容。有优先级的概念是这个队列的特点。采用的是升序,比如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

猜你喜欢

转载自blog.csdn.net/weixin_34148508/article/details/91710196