Java线程队列的使用-PriorityBlockingQueue

妖狐艹你老母 2023-10-12 23:11 70阅读 0赞

PriorityBlockingQueue是一种带优先级的无界阻塞队列,它的元素必须实现Comparable接口,或者在创建时指定一个Comparator对象。它会根据元素的优先级顺序进行排序,优先级高的元素先被获取。

PriorityBlockingQueue可以用于实现优先级任务调度,例如下面的代码创建了一个PriorityBlockingQueue,并向其中添加了四个任务,每个任务有不同的优先级。然后从队列中循环获取任务,并打印出来。

  1. import java.util.concurrent.PriorityBlockingQueue;
  2. // 定义一个任务类,实现Comparable接口
  3. class Task implements Comparable<Task> {
  4. // 任务名称
  5. private String name;
  6. // 任务优先级
  7. private int priority;
  8. // 构造方法,传入任务名称和优先级
  9. public Task(String name, int priority) {
  10. this.name = name;
  11. this.priority = priority;
  12. }
  13. @Override
  14. public int compareTo(Task o) {
  15. // 比较优先级,优先级大的排在前面
  16. return Integer.compare(o.priority, this.priority);
  17. }
  18. @Override
  19. public String toString() {
  20. return "Task{" +
  21. "name='" + name + '\'' +
  22. ", priority=" + priority +
  23. '}';
  24. }
  25. }
  26. public class PriorityBlockingQueueDemo {
  27. public static void main(String[] args) {
  28. // 创建一个优先级阻塞队列
  29. PriorityBlockingQueue<Task> pbq = new PriorityBlockingQueue<>();
  30. // 向队列中添加四个任务,注意它们的优先级
  31. pbq.offer(new Task("task1", 5));
  32. pbq.offer(new Task("task2", 2));
  33. pbq.offer(new Task("task3", 7));
  34. pbq.offer(new Task("task4", 3));
  35. // 从队列中循环获取任务,并打印出来
  36. while (pbq.size() > 0) {
  37. try {
  38. System.out.println(pbq.take());
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }

输出结果:

  1. Task{name='task3', priority=7}
  2. Task{name='task1', priority=5}
  3. Task{name='task4', priority=3}
  4. Task{name='task2', priority=2}

可以看到,队列中的任务按照优先级的顺序被获取,即先获取优先级最高的任务,后获取优先级最低的任务。

发表评论

表情:
评论列表 (有 0 条评论,70人围观)

还没有评论,来说两句吧...

相关阅读