MST

星途 面试题库

面试题:Java PriorityBlockingQueue深度定制:实现复杂优先级策略

假设现在有一个任务类`Task`,包含任务ID、任务优先级(数值越低优先级越高)、任务执行时间等属性。要求基于`PriorityBlockingQueue`实现一个任务队列,当两个任务优先级相同时,按照任务执行时间从短到长排序。请详细说明设计思路,并给出核心的Java代码实现,包括自定义比较器等关键部分。
47.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义Task类,包含任务ID、任务优先级和任务执行时间属性。
  2. 创建一个实现Comparator<Task>接口的自定义比较器,在比较时先比较任务优先级,优先级相同再比较任务执行时间。
  3. 使用PriorityBlockingQueue来存储Task对象,构造PriorityBlockingQueue时传入自定义比较器。

核心Java代码实现

import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.Comparator;

class Task {
    private int taskId;
    private int priority;
    private long executionTime;

    public Task(int taskId, int priority, long executionTime) {
        this.taskId = taskId;
        this.priority = priority;
        this.executionTime = executionTime;
    }

    public int getTaskId() {
        return taskId;
    }

    public int getPriority() {
        return priority;
    }

    public long getExecutionTime() {
        return executionTime;
    }

    @Override
    public String toString() {
        return "Task{" +
                "taskId=" + taskId +
                ", priority=" + priority +
                ", executionTime=" + executionTime +
                '}';
    }
}

class TaskComparator implements Comparator<Task> {
    @Override
    public int compare(Task task1, Task task2) {
        if (task1.getPriority() != task2.getPriority()) {
            return task1.getPriority() - task2.getPriority();
        } else {
            return (int) (task1.getExecutionTime() - task2.getExecutionTime());
        }
    }
}

public class TaskQueueExample {
    public static void main(String[] args) {
        BlockingQueue<Task> taskQueue = new PriorityBlockingQueue<>(10, new TaskComparator());

        taskQueue.add(new Task(1, 2, 100L));
        taskQueue.add(new Task(2, 1, 200L));
        taskQueue.add(new Task(3, 2, 50L));

        while (!taskQueue.isEmpty()) {
            System.out.println(taskQueue.poll());
        }
    }
}