面试题答案
一键面试- 实现思路
- 使用
PriorityQueue
来存储任务,PriorityQueue
可以根据任务的优先级对任务进行排序。 - 自定义一个实现
Runnable
接口的任务类,并实现Comparable
接口来定义任务的优先级比较逻辑。 - 在单线程池中,从
PriorityQueue
中取出优先级最高的任务来执行。
- 使用
- 代码示例
import java.util.PriorityQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {
private final int priority;
private final String taskName;
public PrioritizedTask(int priority, String taskName) {
this.priority = priority;
this.taskName = taskName;
}
@Override
public void run() {
System.out.println("Executing task: " + taskName + " with priority: " + priority);
// 模拟任务执行时间
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
@Override
public int compareTo(PrioritizedTask other) {
return Integer.compare(this.priority, other.priority);
}
}
public class SingleThreadPoolPriorityScheduler {
public static void main(String[] args) {
PriorityQueue<PrioritizedTask> taskQueue = new PriorityQueue<>();
taskQueue.add(new PrioritizedTask(3, "Task C"));
taskQueue.add(new PrioritizedTask(1, "Task A"));
taskQueue.add(new PrioritizedTask(2, "Task B"));
ExecutorService executorService = Executors.newSingleThreadExecutor();
while (!taskQueue.isEmpty()) {
PrioritizedTask task = taskQueue.poll();
executorService.submit(task);
}
executorService.shutdown();
}
}
在上述代码中:
PrioritizedTask
类实现了Runnable
接口和Comparable
接口,compareTo
方法定义了任务优先级的比较逻辑,数值越小优先级越高。SingleThreadPoolPriorityScheduler
类中,创建了一个PriorityQueue
来存储任务,并向其中添加了具有不同优先级的任务。- 使用
Executors.newSingleThreadExecutor()
创建了一个单线程池,从PriorityQueue
中按优先级取出任务并提交到单线程池中执行。最后调用executorService.shutdown()
关闭线程池。