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