Прежде всего: я уже прочитал следующие два вопроса и их возможные решения:
- ScheduledThreadPoolExecutors и настраиваемая очередь
- Исполнители Java: как установить приоритет задачи?
Моя дилемма состоит в том, что я хочу использовать настраиваемую BlockingQueue
или, скорее, другую, но конкретную очередь, а именно PriorityBlockingQueue
с настраиваемым Comparator
, который сортирует очередь по приоритету.
ThreadPoolExecutor
поддерживает настраиваемые очереди в своих конструкторах, но не реализует методы из интерфейса ScheduledExecutorService
. Итак, я пошел и нашел подкласс ScheduledThreadPoolExecutor
, но он не поддерживает настраиваемые очереди и вместо этого использует DelayedWorkQueue
.
Проблемы:
- Я не могу расширяться от
ScheduledThreadPoolExecutor
, потому что создание конструкторов для моего собственного класса ничего не даст, поскольку конструкторыScheduledThreadPoolExecutor
не принимают настраиваемые очереди в качестве параметра. - Я не могу скопировать содержимое класса
ThreadPoolExecutor
и реализацииScheduledThreadPoolExecutor
, потому что он использует множество методов, которые объявлены без модификаторов (например,canRunInCurrentState(boolean periodic)
и все методы, вызываемые этим вызовом), которые не позвольте мне получить доступ к методу, поскольку, несмотря на то, что он является подклассомThreadPoolExecutor
, он не находится в том же пакете.
Моя текущая реализация выглядит так:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.croemheld.tasks.PriorityTaskComparator;
public class ScheduledPriorityThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {
private static final int INITIAL_QUEUE_SIZE = 10;
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()));
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), handler);
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), threadFactory);
}
public ScheduledPriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new PriorityBlockingQueue<Runnable>(INITIAL_QUEUE_SIZE, new PriorityTaskComparator()), threadFactory, handler);
}
@Override
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
// TODO Auto-generated method stub
return null;
}
}
Как видите, проблема конструкторов решена, но остается реализация методов планирования из ScheduledExecutorService
.
Итак, я спрашиваю вас, есть ли способ передать Comparator
в очередь или простой и не слишком исчерпывающий способ создать собственный класс исполнителя, который реализует методы из ScheduledExecutorService
и предлагает методы из класса ThreadPoolExecutor
, а также использует PriorityBlockingQueue
?
ScheduledExecutorService
, но мне не ясно, как вы ожидаете, что они будут взаимодействовать с очередью илиComparator
. Возможно, было бы полезно, если бы вы описали, как вы надеетесь использовать то, что ищете. - person John Bollinger   schedule 14.01.2018ScheduledThreadPoolExecutor
, но вместо использования внутреннегоDelayedWorkQueue
мне нужна очередь, которая сортирует задачи внутри очереди по приоритету. ПосколькуComparator
, используемый вDelayedWorkQueue
, сортируетScheduledFutureTask
объекты по их времени и / или порядковому номеру (см.ScheduledFutureTask#compareTo(Delayed other)
). У меня есть собственный класс задач, и он работает сThreadPoolExecutor
, но когда e. г. Я хочу периодически запускать задачу, мне нужны методыScheduledExecutorService
s. - person CRoemheld   schedule 14.01.2018ThreadPoolExecutor
, расширяютсяFutureTask<V>
и имеют дополнительное поле с именемpriority
. У меня также естьPriorityTaskComparator
, который расширяетComparator<Runnable>
, как и в первой ссылке (stackoverflow.com/a/16577568/3741284). Единственная проблема заключается в том, что в ответе используетсяThreadPoolExecutor
, который не реализует функциональность для периодического планирования задач. Следовательно, этот вопрос о реализацииScheduledExecutorService
или о том, что поможет мне достичь моей цели. - person CRoemheld   schedule 14.01.2018ExecutorService
илиThreadPoolExecutor
только потому, что я не могу инициализировать исполнителя, который обеспечивает поддержку планирования и немедленного выполнения задач, а также периодического выполнения задачи.ThreadPoolExecutor
поддерживает немедленное выполнение и очередь с сортировкой по приоритету, но не выполняется периодически.ScheduledThreadPoolExecutor
поддерживает периодическое выполнение, но без сортировки очереди по приоритету. - person CRoemheld   schedule 14.01.2018ExecutorService
экземпляры для обслуживания этих разных сценариев. Я не считаю это рассуждение очень убедительным, и я действительно не думаю, что вы продумали его с функциональной точки зрения. Стандартная библиотека Java не предоставляет ни заранее созданного способа сделать это, ни частей, которые вы можете легко собрать, чтобы это произошло, потому что это не имеет смысла. - person John Bollinger   schedule 14.01.2018