ScheduledExecutorService
本身并不提供直接設置任務優先級的方法
以下是一個使用 PriorityBlockingQueue
實現的示例:
Runnable
類,其中包含一個表示優先級的字段:public class PriorityRunnable implements Runnable, Comparable<PriorityRunnable> {
private int priority;
private Runnable task;
public PriorityRunnable(int priority, Runnable task) {
this.priority = priority;
this.task = task;
}
@Override
public void run() {
task.run();
}
@Override
public int compareTo(PriorityRunnable other) {
return Integer.compare(other.priority, this.priority);
}
}
PriorityBlockingQueue
實例,并將其傳遞給 ThreadPoolExecutor
:import java.util.concurrent.*;
public class PriorityScheduler {
public static void main(String[] args) {
int corePoolSize = 4;
PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, queue);
// 提交任務
executor.submit(new PriorityRunnable(1, () -> System.out.println("Task with priority 1")));
executor.submit(new PriorityRunnable(3, () -> System.out.println("Task with priority 3")));
executor.submit(new PriorityRunnable(2, () -> System.out.println("Task with priority 2")));
executor.shutdown();
}
}
在這個示例中,我們創建了一個具有 4 個核心線程的線程池。當提交新任務時,它們將根據優先級順序執行。請注意,這種方法可能會導致線程饑餓,因為高優先級任務可能會持續占用線程,從而阻止低優先級任務的執行。為了避免這種情況,可以考慮使用更復雜的調度策略,例如基于時間片輪轉的調度。