У меня есть Executors.newFixedThreadPool (1), в который я посылаю несколько разных задач (все реализуют Runnable), и они ставятся в очередь и запускаются последовательно правильно?
Да, попо умолчанию основной исполнитель пула потоков создается с LinkedBlockingQueue.Поскольку у вас есть только один рабочий поток и очередь используется в режиме FIFO, задачи будут выполняться в следующем порядке.
Каков наилучший способ разрешить выполнение или выполнение только одной из каждой задачи илив очереди в одно время?Я хочу игнорировать все задачи, отправленные в ExecutorService, которые уже находятся в очереди.
Самый простой способ, который я могу себе представить, - это создать собственный ExecutorService, который расширяет ThreadPoolExecutor.Затем переопределите метод execute () так, чтобы вы вызывали BlockingQueue # contains (Object) перед делегированием суперклассам execute.
public class LimitedExecutorService extends ThreadPoolExecutor {
public LimitedExecutorService(final int nThreads) {
super(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
@Override
public void execute(Runnable command) {
if (!this.getQueue().contains(command)) {
super.execute(command);
} else {
//reject
}
}
}
Примечание. Многие люди утверждают, что вам не следует расширять ThreadPoolExecutor, новместо этого скажем, что вы реализуете ExecutorService и ваш класс содержит ThreadPoolExecutor, которому вы делегируете (он же состав).