Как реализовать PriorityBlockingQueue с ThreadPoolExecutor и пользовательскими задачами

я много искал, но не смог найти решение своей проблемы.

У меня есть свой собственный класс, BaseTask , который использует ThreadPoolExecutor для обработки задач. Я хочу приоритезации задач, но когда я пытаюсь использовать PriorityBlockingQueue , я получаю ClassCastException , потому что ThreadPoolExecutor оборачивает мои задачи в объект FutureTask

Это, очевидно, имеет смысл, потому что FutureTask не реализует Comparable , но как я продолжу решать проблему приоритета? Я читал, что вы можете переопределить newTaskFor () в ThreadPoolExecutor , но я не могу найти этот метод вообще ...?

Любые предложения будут высоко оценены !

Некоторый код для помощи:

В моем классе BaseTask у меня есть

private static final BlockingQueue<Runnable> sWorkQueue = new PriorityBlockingQueue<Runnable>();

private static final ThreadFactory sThreadFactory = new ThreadFactory() {
    private final AtomicInteger mCount = new AtomicInteger(1);

    public Thread newThread(Runnable r) {
        return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
    }
};

private static final BaseThreadPoolExecutor sExecutor = new BaseThreadPoolExecutor(
    1, Integer.MAX_VALUE, 10, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

private final BaseFutureTask<Result> mFuture;

public BaseTask(int priority) {
    mFuture = new BaseFutureTask<Result>(mWorker, priority);
}

public final BaseTask<Params, Progress, Result> execute(Params... params) {

    /* Some unimportant code here */

    sExecutor.execute(mFuture);
}

В классе BaseFutureTask

@Override
public int compareTo(BaseFutureTask another) {
    long diff = this.priority - another.priority;

    return Long.signum(diff);
}

В классе BaseThreadPoolExecutor я переопределяю класс 3 submit методов ... Вызывается конструктор в этом классе, но ни один из submit методов

24
задан Gray 19 July 2019 в 13:35
поделиться

1 ответ

Похоже, что это оставили в apache harmony. Существует svn commit log около года назад, исправляющий отсутствие newTaskFor. Вероятно, вы можете просто переопределить функции submit в расширенном ThreadPoolExecutor, чтобы создать расширенный FutureTask, который является Comparable. Они не очень длинные.

0
ответ дан 29 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: