Вам нужно будет указать тип очереди, который использует ExecutorService.
Обычно вы можете получить ExecutorService с помощью статических методов в Executors.Вместо этого вам нужно будет непосредственно создать его экземпляр и передать требуемый тип очереди, который обеспечивает LIFO.
EG, чтобы создать исполнителя пула потоков LIFO, вы можете использовать следующий конструктор.
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
и передайте в очередь LIFO в качестве последнего параметра.
В наборах java, о которых мне известно, нет очереди LIFO (пожалуйста, исправьте меня, если ошибаюсь), но вы можете легко создать анонимного пользователя.внутренний класс, который расширяет LinkedBlockingQueue и переопределяет соответствующие методы.
Например, (не проверено)
ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 16, 1, TimeUnit.MINUTES, new LinkedBlockingQueue() {
@Override
public void put(Object obj) {
// override to put objects at the front of the list
super.addFirst(obj);
}
});
UPDATE в ответ на комментарии.
Мы можем использовать очередь блокировкиэто оборачивает приоритетную очередь.Нам нужно обернуть, потому что Executor ожидает runnables, но нам также нужны временные метки.
// the class that will wrap the runnables
static class Pair {
long timestamp;
Runnable runnable;
Pair(Runnable r) {
this.timestamp = System.currentTimeMillis();
this.runnable = r;
}
}
ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 16, 1, TimeUnit.MINUTES, new BlockingQueue<Runnable>() {
private Comparator comparator = new Comparator<Pair>() {
@Override
public int compare(Pair arg0, Pair arg1) {
Long t1 = arg0.timestamp;
Long t2 = arg1.timestamp;
// compare in reverse to get oldest first. Could also do
// -t1.compareTo(t2);
return t2.compareTo(t1);
}
};
private PriorityBlockingQueue<Pair> backingQueue = new PriorityBlockingQueue<Pair>(11, comparator);
@Override
public boolean add(Runnable r) {
return backingQueue.add(new Pair(r));
}
@Override
public boolean offer(Runnable r) {
return backingQueue.offer(new Pair(r));
}
@Override
public boolean offer(Runnable r, long timeout, TimeUnit unit) {
return backingQueue.offer(new Pair(r), timeout, unit);
}
// implement / delegate rest of methods to the backing queue
});