Java Проблема с приоритетной очередью - PullRequest
1 голос
/ 16 июня 2020

Проблема: у меня есть очередь с приоритетом для обработки действий. Когда я создаю экземпляры действий, а затем добавляю их в очередь, он работает, однако, когда я создаю их напрямую, когда добавляю их в очередь, он больше не сохраняет приоритет.

Это работает - Выполняется по приоритету

 public static void main(String[] args) {

    final Action<Void> low = new LowAction();
    final Action<Void> med = new MedAction();
    final Action<Integer> high = new HighAction();
    final Action<Boolean> walk = new WalkAction();

    final ActionScheduler scheduler = new ActionScheduler(1,10);

    scheduler.queue(high);
    scheduler.queue(walk);
    scheduler.queue(low);
    scheduler.queue(med);

}

Это не работает - Выполняется в том порядке, в котором я их назвал

    public static void main(String[] args) {

    final ActionScheduler scheduler = new ActionScheduler(1,10);

    scheduler.queue(new HighAction());
    scheduler.queue(new WalkAction());
    scheduler.queue(new LowAction());
    scheduler.queue(new MedAction());

}

Класс ActionScheduler

public class ActionScheduler {

private ExecutorService priorityJobPoolExecutor;
private ExecutorService priorityJobScheduler
        = Executors.newSingleThreadExecutor();
private PriorityBlockingQueue<Action<?>> priorityQueue;
private Future<?> result;

public ActionScheduler(Integer poolSize, Integer queueSize) {
    priorityJobPoolExecutor = Executors.newFixedThreadPool(poolSize);
    priorityQueue = new PriorityBlockingQueue<>(queueSize);
    priorityJobScheduler.submit(() -> {
        while (true) {
            try {
                result = priorityJobPoolExecutor.submit(priorityQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
        }
    });
}

public void schedule(Action<?> action) {
    priorityQueue.offer(action);
}

public <T> Future<T> queue(Action<?> action) {
    this.schedule(action);
    return (Future<T>) result;
}

}

Это также работает правильно

public static void main(String[] args) {

    final Action<Void> low = new LowAction();
    final Action<Void> med = new MedAction();
    final Action<Integer> high = new HighAction();
    final Action<Boolean> walk = new WalkAction();

    final ActionScheduler scheduler = new ActionScheduler(1,10);

    scheduler.queue(new HighAction());
    scheduler.queue(new WalkAction());
    scheduler.queue(new LowAction());
    scheduler.queue(new MedAction());

}

Если бы кто-нибудь мог дать какое-либо представление о том, почему это происходит и как я могу заставить его выполнить по приоритету в обоих примерах разместил его будет очень признателен.

EDIT

Action Class

    public abstract class Action<T> implements Callable<T>, Comparable<Action<?>> {

    private final ActionContext context;

    public Action(ActionContext context) {
        this.context = context;
    }

    @Override
    public int compareTo(Action action) {
        if (action.getContext().getPriority() == this.getContext().getPriority()) {
            return 0;
        } else if (this.getContext().getPriority().ordinal() > action.getContext().getPriority().ordinal()) {
            return -1;
        } else {
            return 1;
        }

    }

    public ActionContext getContext() {
        return context;
    }
}

LowAction class

   public class LowAction extends Action<Void> {
    public LowAction() {
        super(new ActionContext("low", Priority.LOW, true, false));
    }


    @Override
    public Void call() throws Exception {
        System.out.println("LOW");
        return null;
    }
 }

1 Ответ

0 голосов
/ 17 июня 2020

Есть одно отличие, которое я вижу в первом подходе, когда вы связываете свой объект с фактическим типом, например final Action<**Void**> low = new LowAction();, с другой стороны, new LowAction() будет рассматриваться как необработанное создание. Внутренняя работа PriorityQueue основана на двоичной куче. Элементы приоритетной очереди упорядочиваются в соответствии с естественным порядком или с помощью компаратора, предоставленного во время построения очереди, в зависимости от того, какой конструктор используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...