1 回答

TA貢獻1828條經驗 獲得超3個贊
您需要將 PriorityBlockingQueue 傳遞給ThreadPoolExecutor,可能使用此構造函數。在下面添加了如何使用比較器初始化 PriorityBlockingQueue 的示例
public ThreadPoolExecutor(int corePoolSize,
? ? ? ? ? ? ? ? ? ? ? ? ? int maximumPoolSize,
? ? ? ? ? ? ? ? ? ? ? ? ? long keepAliveTime,
? ? ? ? ? ? ? ? ? ? ? ? ? TimeUnit unit,
? ? ? ? ? ? ? ? ? ? ? ? ? BlockingQueue<Runnable> workQueue) {
? ? this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
? ? ? ? ?Executors.defaultThreadFactory(), defaultHandler);
}
編輯 - 將比較器添加到優先級隊列的示例
import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class PriorityBlockQueueTest {
? ? private static BlockingQueue<PriorityTask> taskQueue = new PriorityBlockingQueue<>(10,
? ? ? ? ? ? new Comparator<PriorityTask>() {
? ? ? ? @Override
? ? ? ? public int compare(PriorityTask o1, PriorityTask o2) {
? ? ? ? ? ? return o2.getData() - o1.getData();
? ? ? ? }
? ? });
? ? public static void main(String arg[]) {
? ? ? ? taskQueue.add(new PriorityTask(2, 10));
? ? ? ? taskQueue.add(new PriorityTask(1, 11));
? ? ? ? System.out.println(taskQueue);
? ? }
? ? private static class PriorityTask implements? Runnable {
? ? ? ? private int priority;
? ? ? ? private int data;
? ? ? ? public PriorityTask(int priority, int data) {
? ? ? ? ? ? this.priority = priority;
? ? ? ? ? ? this.data = data;
? ? ? ? }
? ? ? ? public int getData() {
? ? ? ? ? ? return data;
? ? ? ? }
? ? ? ? public void run() {
? ? ? ? ? ? System.out.println("Running something");
? ? ? ? }
? ? ? ? public String toString() {
? ? ? ? ? ? return "priority: " + priority + " data: " + data;
? ? ? ? }
? ? }
}
添加回答
舉報