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天