ScheduledExecutorService
本身并不提供直接設(shè)置任務(wù)優(yōu)先級的方法
以下是一個使用 PriorityBlockingQueue
實現(xiàn)的示例:
Runnable
類,其中包含一個表示優(yōu)先級的字段: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);
// 提交任務(wù)
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();
}
}
在這個示例中,我們創(chuàng)建了一個具有 4 個核心線程的線程池。當(dāng)提交新任務(wù)時,它們將根據(jù)優(yōu)先級順序執(zhí)行。請注意,這種方法可能會導(dǎo)致線程饑餓,因為高優(yōu)先級任務(wù)可能會持續(xù)占用線程,從而阻止低優(yōu)先級任務(wù)的執(zhí)行。為了避免這種情況,可以考慮使用更復(fù)雜的調(diào)度策略,例如基于時間片輪轉(zhuǎn)的調(diào)度。