java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列
前言
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue,本文為系列文章第五篇。
Java PriorityBlockingQueue隊列是BlockingQueue接口的實現(xiàn)類,它根據(jù)priority優(yōu)先級確定隊列內(nèi)元素對象的處理順序,也就是說在一個PriorityBlockingQueue隊列中,被添加到隊列中的元素,根據(jù)priority進行排序。PriorityBlockingQueue具有BlockingQueue阻塞隊列的一些特性,如果您不熟悉BlockingQueue可以參看我之前的文章。

1. PriorityBlockingQueue 特性
- PriorityBlockingQueue 是一個無界隊列(隊列內(nèi)元素個數(shù)沒有上限),隊列容量可以自動增長。其初始化隊列容量為11,也可以通過構(gòu)造函數(shù)參數(shù)initialCapacity指定其初始化容量。
- 不接受 NULL對象插入到PriorityBlockingQueue
- 添加到PriorityBlockingQueue隊列中的元素對應的Java類,通常需要實現(xiàn)Comparable接口或者是可以默認排序的對象(如數(shù)字、字符串),否則會拋出ClassCastException
- 可以使用java8 的Comparator提供自定義隊列內(nèi)元素的排序規(guī)則,后文會舉例說明。
- 如果存在多個對象擁有相等的優(yōu)先級,從隊列中poll獲取元素的時候可能獲取到其中任何一個元素。
- PriorityBlockingQueue 是線程安全的
2. PriorityBlockingQueue 應用實例
我們寫一個類Employee,該類實現(xiàn)了Comparable接口,所以其實例對象可以根據(jù)compareTo()函數(shù)定義的規(guī)則進行排序。
public class Employee implements Comparable<Employee> {
private Long id;
private String name;
private LocalDate dob;
//Getters and setters
public Employee(Long id, String name, LocalDate dob) {
super();
this.id = id;
this.name = name;
this.dob = dob;
}
@Override
public int compareTo(Employee emp) {
return this.getId().compareTo(emp.getId()); //根據(jù)id排序
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]";
}
}
構(gòu)造一個PriorityBlockingQueue對象,并向其內(nèi)部加入若干Employee對象,并使用poll方法從隊列內(nèi)取出元素。
PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>();
priorityBlockingQueue.add(new Employee(1l, "AAA", LocalDate.now()));
priorityBlockingQueue.add(new Employee(4l, "CCC", LocalDate.now()));
priorityBlockingQueue.add(new Employee(5l, "BBB", LocalDate.now()));
priorityBlockingQueue.add(new Employee(2l, "FFF", LocalDate.now()));
priorityBlockingQueue.add(new Employee(3l, "DDD", LocalDate.now()));
priorityBlockingQueue.add(new Employee(6l, "EEE", LocalDate.now()));
while(true) {
Employee e = priorityBlockingQueue.poll();
System.out.println(e);
if(e == null) break;
}
根據(jù)上文中compareTo()方法定義的排序規(guī)則,按照id為優(yōu)先級,所以從隊列中拿出對象并打印的順序如下:
Employee [id=1, name=AAA, dob=2021-03-25] Employee [id=2, name=FFF, dob=2021-03-25] Employee [id=3, name=DDD, dob=2021-03-25] Employee [id=4, name=CCC, dob=2021-03-25] Employee [id=5, name=BBB, dob=2021-03-25] Employee [id=6, name=EEE, dob=2021-03-25]
3. 使用 Java8 Comparator 做優(yōu)先級排序的實例
我們可以使用java 8 Comparator排序器,來定義優(yōu)先級排序規(guī)則。使用構(gòu)造方法PriorityBlockingQueue(int initialCapacity, Comparator comparator) 構(gòu)造PriorityBlockingQueue隊列。
//以員工名稱的字符串自然正序進行排序 Comparator<Employee> nameSorter = Comparator.comparing(Employee::getName); PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>( 11, nameSorter ); //此處省略向隊列中添加對象,及循環(huán)取出對象打印的代碼,參考上文
按照員工姓名進行優(yōu)先級排序,所以打印順序AAA、BBB、CCC、DDD、EEE、FFF
Employee [id=1, name=AAA, dob=2021-03-25] Employee [id=5, name=BBB, dob=2021-03-25] Employee [id=4, name=CCC, dob=2021-03-25] Employee [id=3, name=DDD, dob=2021-03-25] Employee [id=6, name=EEE, dob=2021-03-25] Employee [id=2, name=FFF, dob=2021-03-25]
以上就是java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列的詳細內(nèi)容,更多關(guān)于java并發(fā)PriorityBlockingQueue隊列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java統(tǒng)計50個10到50之間整數(shù)的隨機出現(xiàn)次數(shù)
這篇文章主要為大家詳細介紹了Java統(tǒng)計50個10到50之間整數(shù)的隨機出現(xiàn)次數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
使用java代碼獲取新浪微博應用的access token代碼實例
這篇文章主要介紹了使用java代碼獲取新浪微博應用的access token實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05
SpringBoot中的ThreadLocal保存請求用戶信息的實例demo
線程局部變量,創(chuàng)建一個線程變量后,針對這個變量可以讓每個線程擁有自己的變量副本,每個線程是訪問的自己的副本,與其他線程的相互獨立,本文介紹SpringBoot中的ThreadLocal保存請求用戶信息,需要的朋友可以參考下2024-05-05
SpringBoot使用Flyway進行數(shù)據(jù)庫遷移的實現(xiàn)示例
Flyway是一個數(shù)據(jù)庫遷移工具,它提供遷移歷史和回滾的功能,本文主要介紹了如何使用Flyway來管理Spring Boot應用程序中的SQL數(shù)據(jù)庫架構(gòu),感興趣的可以了解一下2023-08-08
Windows下使用IDEA搭建Hadoop開發(fā)環(huán)境的詳細方法
這篇文章主要介紹了Windows下使用IDEA搭建Hadoop開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
SpringBoot使用DevTools實現(xiàn)后端熱部署的過程詳解
在Spring Boot項目中,Spring Boot官方提供你了Devtools熱部署模塊,通過maven的方式導入就能使用,本文主要SpringBoot通過DevTools實現(xiàn)熱部署,感興趣的朋友一起看看吧2023-11-11

