可以使用Java中的ConcurrentLinkedQueue作为任务队列,每个任务都可以封装成一个Runnable对象,然后在另一个线程中执行这些任务。为了按照公平原则执行任务,可以在队列中使用Iterator遍历任务,并且为每个任务设置一个权重值,权重越高的任务会被先执行。
示例代码如下:
import java.util.Comparator;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class FairTaskExecutor {
private final ConcurrentLinkedQueue tasks = new ConcurrentLinkedQueue<>();
private final AtomicInteger sequence = new AtomicInteger(0);
/**
* 添加任务到队列
* @param task 任务
* @param priority 权重值
*/
public void addTask(Runnable task, int priority) {
taskPriority = sequence.getAndIncrement() * 100 + priority;
tasks.add(new PriorityRunnable(task, taskPriority));
}
/**
* 执行任务
*/
public void executeTasks() {
Runnable task;
while ((task = tasks.poll()) != null) {
task.run();
}
}
/**
* 带有优先级的Runnable
*/
private class PriorityRunnable implements Runnable, Comparable {
private final Runnable task;
private final int priority;
public PriorityRunnable(Runnable task, int priority) {
this.task = task;
this.priority = priority;
}
@Override
public void run() {
task.run();
}
@Override
public int compareTo(PriorityRunnable other) {
return Integer.compare(priority, other.priority);
}
}
}
使用示例:
// 创建任务执行器
FairTaskExecutor executor = new FairTaskExecutor();
// 添加任务
executor.addTask(() -> System.out.println("Task 1 - Low Priority"), 1);
executor.addTask(() -> System.out.println("Task 2 - High Priority"), 10);
executor.addTask(() -> System.out.println("Task 3 - Medium Priority"), 5);
// 按照公平原则执行任务
executor.executeTasks();
``