1. 程式人生 > >JAVA併發程式設計隨筆【一】PriorityBlockingQueue優先順序佇列

JAVA併發程式設計隨筆【一】PriorityBlockingQueue優先順序佇列

一、優先順序佇列PriorityBlockingQueue必須是實現Comparable介面,佇列通過這個介面的compare方法確定物件的priority。當前和其他物件比較,如果compare方法返回負數,那麼在佇列裡面的優先順序就比較搞

    比較規則:當前物件和其他物件做比較,當前優先順序大就返回-1,優先順序小就返回1

二、優先順序佇列是一個基於堆的無界併發安全的優先順序佇列。

三、優先順序佇列不允許null值,不允許未實現Comparable介面的物件。

四、優先順序中傳入的實體物件

package framework.yaomy.example;


/**
 * @Description:TODO
 * @version 1.0
 * @since JDK1.7
 * @author yaomingyang
 * @company xxxxxxxxxxxxxx
 * @copyright (c) 2017 yaomy Co'Ltd Inc. All rights reserved.
 * @date 2017年8月27日 上午10:33:48
 */
public class User implements Comparable<User>{

    private Integer priority;
    private String username;
    
    public Integer getPriority() {
        return priority;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    /**
     *
     * @Description:當前物件和其他物件做比較,當前優先順序大就返回-1,優先順序小就返回1
     * 值越小優先順序越高
     * @param TODO
     * @author yaomingyang
     * @date 2017年8月27日 上午11:28:10
     */
    @Override
    public int compareTo(User user) {
//        System.out.println("比較結果"+this.priority.compareTo(user.getPriority()));
        return this.priority.compareTo(user.getPriority());
    }
}

五、測試優先順序佇列

public class PriorityBlockQueueDemo {

    public static void main(String[] args) {
        PriorityBlockingQueue<User> queue = new PriorityBlockingQueue<User>();
        for(int i=0; i<12; i++){
            User user = new User();
            int max=20;
            int min=10;
            Random random = new Random();

            int n = random.nextInt(max)%(max-min+1) + min;

            user.setPriority(n);
            user.setUsername("李豔第"+i+"天");
            
            queue.add(user);
        }
        
        for(int i=0; i<12; i++){
            User u = queue.poll();
            System.out.println("優先順序是:"+u.getPriority()+","+u.getUsername());
        }
    }
}

輸出結果:

    優先順序是:10,李豔第0天
    優先順序是:10,李豔第3天
    優先順序是:10,李豔第7天
    優先順序是:10,李豔第10天
    優先順序是:10,李豔第6天
    優先順序是:11,李豔第1天
    優先順序是:11,李豔第5天
    優先順序是:13,李豔第9天
    優先順序是:15,李豔第11天
    優先順序是:16,李豔第4天
    優先順序是:17,李豔第2天
    優先順序是:17,李豔第8天