欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列

 更新時間:2022年03月16日 10:13:26   作者:字母哥哥  
這篇文章主要為大家介紹了java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊列的方法示例應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

前言

在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue,本文為系列文章第五篇。

Java PriorityBlockingQueue隊列是BlockingQueue接口的實現(xiàn)類,它根據(jù)priority優(yōu)先級確定隊列內(nèi)元素對象的處理順序,也就是說在一個PriorityBlockingQueue隊列中,被添加到隊列中的元素,根據(jù)priority進(jìn)行排序。PriorityBlockingQueue具有BlockingQueue阻塞隊列的一些特性,如果您不熟悉BlockingQueue可以參看我之前的文章。

1. PriorityBlockingQueue 特性

  • PriorityBlockingQueue 是一個無界隊列(隊列內(nèi)元素個數(shù)沒有上限),隊列容量可以自動增長。其初始化隊列容量為11,也可以通過構(gòu)造函數(shù)參數(shù)initialCapacity指定其初始化容量。
  • 不接受 NULL對象插入到PriorityBlockingQueue
  • 添加到PriorityBlockingQueue隊列中的元素對應(yīng)的Java類,通常需要實現(xiàn)Comparable接口或者是可以默認(rèn)排序的對象(如數(shù)字、字符串),否則會拋出ClassCastException
  • 可以使用java8 的Comparator提供自定義隊列內(nèi)元素的排序規(guī)則,后文會舉例說明。
  • 如果存在多個對象擁有相等的優(yōu)先級,從隊列中poll獲取元素的時候可能獲取到其中任何一個元素。
  • PriorityBlockingQueue 是線程安全的

2. PriorityBlockingQueue 應(yīng)用實例

我們寫一個類Employee,該類實現(xiàn)了Comparable接口,所以其實例對象可以根據(jù)compareTo()函數(shù)定義的規(guī)則進(jìn)行排序。

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隊列。

//以員工名稱的字符串自然正序進(jìn)行排序
Comparator<Employee> nameSorter = Comparator.comparing(Employee::getName);
PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>( 11, nameSorter );
//此處省略向隊列中添加對象,及循環(huán)取出對象打印的代碼,參考上文

按照員工姓名進(jì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)先級隊列的詳細(xì)內(nèi)容,更多關(guān)于java并發(fā)PriorityBlockingQueue隊列的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMvc使用GoogleKaptcha生成驗證碼

    SpringMvc使用GoogleKaptcha生成驗證碼

    這篇文章主要為大家詳細(xì)介紹了SpringMvc項目中使用GoogleKaptcha 生成驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 通過Java實現(xiàn)添加或刪除PDF中的附件

    通過Java實現(xiàn)添加或刪除PDF中的附件

    當(dāng)我們在制作PDF文件或者PPT演示文稿的時候,為了讓自己的文件更全面詳細(xì),就會在文件中添加附件。本文為大家整理了Java實現(xiàn)添加或刪除PDF中的附件的方法,需要的可以參考下
    2023-01-01
  • Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn)

    Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn)

    這篇文章主要介紹了Spring?MVC異步上傳、跨服務(wù)器上傳和文件下載功能實現(xiàn),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java基礎(chǔ)的詳細(xì)了解第九天

    java基礎(chǔ)的詳細(xì)了解第九天

    這篇文章對Java編程語言的基礎(chǔ)知識作了一個較為全面的匯總,在這里給大家分享一下。需要的朋友可以參考,希望能給你帶來幫助
    2021-08-08
  • 在netty中使用native傳輸協(xié)議的方法

    在netty中使用native傳輸協(xié)議的方法

    這篇文章主要介紹了在netty中使用native傳輸協(xié)議,這里我們只以Kqueue為例介紹了netty中native傳輸協(xié)議的使用,需要的朋友可以參考下
    2022-05-05
  • Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析一之零配置文件化

    Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析一之零配置文件化

    Dwr對我來說最重要的功能點(diǎn)就是反向Ajax調(diào)用,通俗來將就是后端可以直接調(diào)用前端的JS方法(只要在所能訪問的范圍內(nèi)),這也就是Dwr的真正來由,當(dāng)然它也有最基本的前端直接調(diào)用后端的特性,省去了我們經(jīng)常的一般Ajax調(diào)用
    2016-04-04
  • Java多線程事務(wù)回滾@Transactional失效處理方案

    Java多線程事務(wù)回滾@Transactional失效處理方案

    這篇文章主要介紹了Java多線程事務(wù)回滾@Transactional失效處理方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • springboot整合RabbitMQ 中的 TTL實例代碼

    springboot整合RabbitMQ 中的 TTL實例代碼

    TTL 是 RabbitMQ 中一個消息或者隊列的屬性,表明一條消息或者該隊列中的所有消息的最大存活時間,單位是毫秒,這篇文章主要介紹了springboot整合RabbitMQ 中的 TTL,需要的朋友可以參考下
    2022-09-09
  • java?long?類型數(shù)據(jù)的賦值方式

    java?long?類型數(shù)據(jù)的賦值方式

    這篇文章主要介紹了java?long?類型數(shù)據(jù)的賦值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java 同步鎖(synchronized)詳解及實例

    Java 同步鎖(synchronized)詳解及實例

    這篇文章主要介紹了Java 同步鎖(synchronized)詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論