У меня есть Executors.newFixedThreadPool (1), который я отправляю нескольким различным задачам (все реализующие Runnable), и они попадают в очередь и запускаются последовательно правильно? Каков наилучший способ разрешить одновременное выполнение одной или каждой задачи? Я хочу игнорировать все задачи, отправленные в ExecutorService, которые уже находятся в очереди.Ограничение одного из каждого типа Runnable в очереди ExecutorService
ответ
The thread pool нет гарантия заказ заказ.
Что касается второй части, вы можете установить отклоненный обработчик выполнения, используя ThreadPoolExecutor.DiscardPolicy
с помощью ThreadPoolExecutor
У меня есть 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, который вы делегировать (ака композиции).
- 1. Executorservice and Runnable
- 2. Максимальное время ожидания в очереди в ExecutorService
- 3. ExecutorService не вызывает run() в Runnable
- 4. Нечетное поведение с Runnable и ExecutorService
- 5. Как сделать поток из своего ExecutorService связываться с Runnable?
- 6. Что произойдет, если Runnable выполняется несколько раз в ExecutorService
- 7. Восстановление из-за исключения в ExecutorService
- 8. Android: Как включить Runnable в очереди сообщений?
- 9. ExecutorService runnable никогда не попадает в try при возникновении исключения
- 10. Ограничение очереди сообщений MFC
- 11. Ограничение веса очереди Sidekiq
- 12. ExecutorService - Как установить значения в Runnable/Callable и повторно использовать
- 13. Вызов Runnable из Runnable
- 14. Эффективный способ дождаться завершения Runnable задач в ExecutorService
- 15. ExecutorService ждут сигнала завершения работы в экземпляре Runnable
- 16. Как избежать ExecutorService от переопределения Принцип безопасности Runnable
- 17. Ограничение очереди со временем
- 18. андроид: ExecutorService: - ExecutorService не ждет ExecutorService завершить
- 19. Ограничение очереди redis в диапазоне
- 20. Как отключить ExecutorService в приложении для Android
- 21. ограничение каждого тега из OR в MySQL
- 22. Ограничение типа
- 23. Как уменьшить временную задержку, чтобы получить метод runnable класса Runnable с использованием ExecutorService Java
- 24. Обновление GUI из runnable
- 25. ExecutorService справедливость
- 26. Rethrow проверяемого исключения из Runnable
- 27. Преобразование в ExecutorService
- 28. Java Runnable Queue
- 29. Как поймать исключение при любой Thread/Runnable/Callable в ExecutorService терпит неудачу в ожидании прекращения
- 30. Ограничение очереди SignalR для пользователя