Ребята, я немного расстроен между Tree Set
и Thread Pool Executor
Ниже приведен сценарий:
Первый подход
treeset constructor
(с интерфейсом comparator
)Второй подход
Thread pool executor
и для этого я воодушевился этой ссылкой, и я достиг своих требований с этим подходом, который сначала выберет приоритетное задание и выполнит его сначала, и таким же образом он выполнит все задачи.Теперь моя путаница заключается в том, какой из них лучше всего использовать с точки зрения затрат на производительность, гибкости (увеличение/уменьшение потоков) и т.д. И почему я должен ее выбирать?
Любые предложения и ответы высоко ценятся.
Наконец, получился настоящий победитель из этих двух. Я должен выбрать для Thread pool Executor
из-за следующих причин
thread pool executor
и наоборот.comparator
хотя он имеет сложность O (logn), но после этого мы должны его получить, и он станет последовательным потоком одиночных поэтому мы не будем использовать многопоточную среду.и т.д. были причинами, которые я указывал во время тяжелого мозгового штурма, поиска в поисковых системах и последнего, но не наименьшего поиска. Спасибо вам всем за вашу скромную поддержку и огромную благодарность @didierc за то, что вы меня поняли.
Вы можете попробовать DelayedQueue в обычном threadpool.
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(size, size, 0, TimeUnit.DAYS, new DelayQueue<>());
threadPoolExecutor.execute(runnable);
Runnable должен реализовывать Comparable. Поэтому в этой реализации приоритет будет зависеть от задержки.
Такой подход будет проще реализовать.
В вашем вопросе есть два разных понятия приоритета:
стартовый приоритет: в каком порядке задачи отправляются на исполнение (пункт 1 вашего первого подхода)
приоритет выполнения: в каком порядке рассматриваются потоки заказов для планирования (точка 3)
Эти два свойства оказываются одинаковыми в вашем сценарии, поэтому набор деревьев поможет вам определить их оба. Исполнитель поможет вам обеспечить их соблюдение, но вам понадобится специальный пользовательский исполнитель (на основе пула потоков или нет), чтобы начать ваши потоки с определенным приоритетом. В принципе, каждый раз, когда задача вытягивается из очереди приоритетов, она должна быть связана с потоком, установленным на уровне приоритета задачи. Я предполагаю, что это функция, которую реализует реализация исполнителя в статье, которую вы указываете, и, следовательно, что вы делаете.
Что касается пулов потоков, из документации:
Использование рабочих потоков минимизирует накладные расходы из-за создания потоков. Объекты Thread используют значительный объем памяти, а в крупномасштабном приложении выделение и освобождение многих объектов потоков создает значительные накладные расходы на управление памятью.
Рабочие потоки - это потоки, управляемые файловыми путями, и консервативно перерабатываются (в отличие от уничтоженных и воссозданных) для обработки последовательностей задач. Я не думаю, что это имеет большое значение в отношении приоритетной обработки, но это оптимизирует использование вами ресурсов.
Что касается реализации из статьи, в коде используется простой блокирующий деб для обработки входящих задач, следовательно, это простая схема приоритета fifo. Он не изменяет порядок задач.
tree set
- это хорошо, но моя путаница связана с трудоемкостью, затратами на производительность при большой нагрузке, гибкостью и т. д. в зависимости от того, какой из них выбрать.
PriorityQueue
с тем же компаратором? Спрашивать, что является «лучшим», действительно зависит от вашего варианта использования и рабочей нагрузки, поскольку нет единого ответа, который всегда будет работать для вашей конкретной задачи.