2010-04-08 2 views
1

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

ответ

1

У меня есть Executors.newFixedThreadPool (1), что я посылаю несколько различных задач на (все реализации Runnable), и они попадают в очередь и запускаются последовательно правильно?

Да, по умолчанию основной исполнитель пула потоков создается с помощью LinkedBlockingQueue. Поскольку у вас есть только один рабочий поток, а очередь используется в режиме FIFO, задачи будут выполняться по порядку.

Каков наилучший способ, позволяющий только одной или каждой задаче запускать или ставить в очередь за один раз? Я хочу игнорировать все задачи, отправленные в ExecutorService, которые уже находятся в очереди.

Самый простой способ, я могу думать, - создать собственный ExecutorService, который расширяет ThreadPoolExecutor. Затем переопределите метод execute(), который вы вызываете BlockingQueue # содержит (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, который вы делегировать (ака композиции).

Смежные вопросы