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çado
ClassCastException
- 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 Employee
que 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.