Ferramenta de programação simultânea Java classe JUC quinta: Fila de prioridade PriorityBlockingQueue

No artigo anterior, apresentei as ferramentas de programação simultânea Java: interface BlockingQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue.Este artigo é o quinto artigo da série.

A fila Java PriorityBlockingQueue é uma classe de implementação da interface BlockingQueue. Ela determina a ordem de processamento dos objetos de elemento na fila de acordo com a prioridade de prioridade, ou seja, em uma fila PriorityBlockingQueue, os elementos adicionados à fila são classificados de acordo com o prioridade. PriorityBlockingQueue tem alguns recursos do BlockingQueue. Se você não estiver familiarizado com o BlockingQueue, pode consultar meu artigo anterior.

1. PriorityBlockingQueue 特性

  • PriorityBlockingQueue é uma fila ilimitada (não há limite superior para o número de elementos na fila) e a capacidade da fila pode aumentar automaticamente. A capacidade inicial da fila é 11, e a capacidade inicial também pode ser especificada por meio do parâmetro do construtor initialCapacity.
  • Não aceita objetos NULL inseridos em PriorityBlockingQueue
  • A classe Java correspondente ao elemento adicionado à fila PriorityBlockingQueue geralmente precisa implementar a interface Comparable ou um objeto que pode ser classificado por padrão (como números, strings), caso contrário, será lançadoClassCastException
  • Você pode usar o Comparador do java8 para fornecer regras de classificação personalizadas para os elementos na fila, que serão ilustradas posteriormente.
  • Se houver vários objetos com a mesma prioridade, qualquer um dos elementos pode ser obtido quando o elemento é obtido na votação na fila.
  • PriorityBlockingQueue é thread-safe

2. Exemplo de aplicativo PriorityBlockingQueue

Escrevemos uma classe Employeeque implementa a interface Comparable, para que seus objetos de instância possam ser classificados de acordo com as regras definidas pela função compareTo ().

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());  //根据id排序
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]";
    }
}

Construa um objeto PriorityBlockingQueue, adicione vários objetos Employee a ele e use o método poll para remover elementos da fila.

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;
}

De acordo com as regras de classificação definidas pelo método compareTo () acima, de acordo com id como a prioridade, a ordem de retirar objetos da fila e imprimi-los é a seguinte:

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. Exemplo de uso do Java8 Comparator para priorizar

Podemos usar o classificador Java 8 Comparator para definir regras de classificação de prioridade. Use o construtor PriorityBlockingQueue (int initialCapacity, Comparator comparator) para construir a fila PriorityBlockingQueue.

//以员工名称的字符串自然正序进行排序
Comparator<Employee> nameSorter = Comparator.comparing(Employee::getName);

PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>( 11, nameSorter );

//此处省略向队列中添加对象,及循环取出对象打印的代码,参考上文

Priorize de acordo com o nome do funcionário, para que a ordem de impressão seja 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]

.

Bem-vindo a seguir meu blog, existem muitas coleções boutique

  • Este artigo é reproduzido com a indicação da fonte (a conexão deve ser anexada, e o texto não pode ser reproduzido somente): Carta Blog da Brother .

Se você acha que é útil para você, por favor, curta e compartilhe para mim! Seu apoio é minha motivação criativa inesgotável! . Além disso, o autor produziu o seguinte conteúdo de alta qualidade recentemente e espero sua atenção.

Acho que você gosta

Origin blog.csdn.net/hanxiaotongtong/article/details/115223260
Recomendado
Clasificación