PriorityBlockingQueue优先级队列

2020-01-16  本文已影响0人  禾叶super

PriorityBlockingQueue是一个支持优先级的无界阻塞队列,即队列里的数据可根据自定义的优先级顺序在队列中浮动。PriorityBlockingQueue是BlockingQueue阻塞队列的一个实现类,什么是阻塞队列?要想理解阻塞队列,首先理解阻塞二字是关键。

BlockingQueue接口的特点是:如果队列里没有可用空间,则插入操作将会被阻塞;而如果队列里没有可用数据,则删除操作将被阻塞。使用阻塞队列的好处就是实现多个相互协作的线程之间交换数据。也就是说,多个线程同时向阻塞队列里放数据,如果队列的空间满了(按照无界队列的说法空间是不会满的),那么再有线程向队列里放数据就需要等待消费者线程把队列中的数据取出。就像去停车,如果车位满了,就需要在停车场外面等待车位空出来才可以继续进入停车场,在这里的等待就是线程阻塞。阻塞的意思就是线程被挂起,处于等待状态。

优先级队列PriorityBlockingQueue必须实现Comparable接口。
实现接口有两种方式

// 方式1 
public class User {
    private Integer priority;

    public Integer getPriority() {
        return priority;
    }

    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    @Override
    public String toString() {
        return "User{" +
                "priority=" + priority +
                '}';
    }
}

public class Test {
    public static void main(String[] args) {
        BlockingQueue<User> queue = new PriorityBlockingQueue<>(5,new Compare());
        for (int i = 0;i < 10;i++){
            User user = new User();
            user.setPriority(i);
            try {
                queue.put(user);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        while (true){
           User user = queue.poll();
            if (user == null){
                break;
            }
            System.out.println(user);
        }
    }

    private static class Compare implements Comparator<User> {

        @Override
        public int compare(User o1, User o2) {
            if (o1.getPriority() == o2.getPriority()) {
                return 0;
            }else {
                return o2.getPriority() - o1.getPriority();
            }
        }
    }
}

// 方式2
public class User  implements Comparable<User> {
    private Integer priority;
    //当前对象和其他对象做比较,当前优先级大就返回-1,优先级小就返回1
    @Override
    public int compareTo(User o) {
        return this.priority.compareTo(o.getPriority());
    }
}
上一篇下一篇

猜你喜欢

热点阅读