使用 PriorityBlockingQueue
实现一个简单的任务调度系统主要涉及定义任务的优先级规则和任务处理逻辑。以下是实现步骤和示例代码:
步骤 1: 定义任务类
首先,定义一个任务类(例如 Task
),它实现了 Comparable
接口以支持优先级比较。
class Task implements Comparable<Task> {
private int priority; // 任务优先级,可以是整数
private String description; // 任务描述
public Task(int priority, String description) {
this.priority = priority;
this.description = description;
}
@Override
public int compareTo(Task other) {
// 优先级高的排在前面,即数值小的优先级高
return Integer.compare(this.priority, other.priority);
}
@Override
public String toString() {
return "Task{" +
"priority=" + priority +
", description='" + description + '\'' +
'}';
}
}
步骤 2: 创建任务调度器
创建一个任务调度器类,使用 PriorityBlockingQueue
来管理任务。
public class TaskScheduler {
private PriorityBlockingQueue<Task> taskQueue;
public TaskScheduler() {
this.taskQueue = new PriorityBlockingQueue<>();
}
// 添加任务到队列
public void addTask(Task task) {
taskQueue.put(task);
}
// 从队列中取出并执行任务
public void executeTasks() throws InterruptedException {
while (!Thread.currentThread().isInterrupted()) {
Task task = taskQueue.take(); // 阻塞直到队列中有任务可用
processTask(task);
}
}
private void processTask(Task task) {
// 任务处理逻辑,例如打印任务信息
System.out.println("Executing task: " + task);
// 这里可以添加实际的任务执行代码
}
}
步骤 3: 运行任务调度器
创建任务调度器的实例,添加一些任务,并启动任务调度逻辑。
public class TaskSchedulerDemo {
public static void main(String[] args) {
TaskScheduler scheduler = new TaskScheduler();
// 添加一些任务
scheduler.addTask(new Task(1, "High priority task"));
scheduler.addTask(new Task(5, "Low priority task"));
scheduler.addTask(new Task(3, "Medium priority task"));
// 启动任务执行线程
Thread taskExecutor = new Thread(() -> {
try {
scheduler.executeTasks();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Task execution interrupted.");
}
});
taskExecutor.start();
}
}
在这个示例中,我们创建了一个 TaskScheduler
类,它使用 PriorityBlockingQueue
来存储任务。任务根据优先级自动排序,高优先级的任务会先被执行。executeTasks
方法中的 take()
调用会阻塞,直到队列中有任务可用,这保证了任务按优先级顺序执行。
注意,实际的任务调度系统可能需要考虑更多的因素,如任务的添加和移除操作的线程安全性、任务执行的异常处理、任务执行的并发控制等。此外,可以根据需要实现更复杂的任务取消、暂停和恢复等功能。