Я много искал, но не смог найти решение моей проблемы.Как реализовать PriorityBlockingQueue с ThreadPoolExecutor и настраиваемые задачи
У меня есть свой класс, BaseTask
, который использует задачи ThreadPoolExecutor
.
Если я не хочу приоритезации (т.е. с использованием LinkedBlockingQueue
), это работает отлично, но когда я пытаюсь использовать 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
См. Также http://stackoverflow.com/questions/807223/how-do-implement-task-prioritization-using-an-executorservice-in-java-5 –
Тема, на которую ссылается OP, это http: //переполнение стека.com/questions/11430574/how-to-have-un-unbound-sortable-queue-used-by-a-fixed-amount-of-threads/12663571 # 12663571 –