Ограничение одного из каждого типа Runnable в очереди ExecutorService - PullRequest
1 голос
/ 08 апреля 2010

У меня есть Executors.newFixedThreadPool (1), в который я посылаю несколько разных задач (все реализуют Runnable), и они ставятся в очередь и последовательно работают правильно?Как лучше всего разрешить запускать или ставить в очередь только одну задачу?Я хочу игнорировать все задачи, отправленные в ExecutorService, которые уже находятся в очереди.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

У меня есть 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, которому вы делегируете (он же состав).

0 голосов
/ 08 апреля 2010

Пул потоков не гарантирует порядок задач.

Что касается второй части, вы можете установить обработчик отклоненного выполнения, используя ThreadPoolExecutor.DiscardPolicy, используя ThreadPoolExecutor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...