1

Ребят я в разрядном дилеммы между Tree Set и Thread Pool ExecutorЛучший подход: дерево структура набора против пула потоков ИСПОЛНИТЕЛЬ

Ниже приводится сценарий:

Первый подход

  1. Я должен использовать структуру который имеет задачи в нем с приоритетами каждой задачи. Теперь на основе treeset constructor (с интерфейсом comparator)
  2. Я могу сравнить задачу по приоритетам и на основе при этом задания упорядочиваются должным образом.
  3. Теперь после этого задачи должны обрабатываться в порядке приоритета через итерацию набора деревьев и выполнять каждую задачу поочередно.

Второй подход

  1. второй подход, чтобы сделать какую-то логику построения и использовать базовую функциональность Thread pool executor и для этого я взял вдохновение из this link и я достиг моих требований с этим подходом и которым сначала выберет приоритетное задание и выполнит его первым и таким же образом выполнит все задачи.

Теперь мое замешательство заключается в том, какой из них лучше всего использовать в отношении эксплуатационных расходов, гибкости (увеличения/уменьшения потоков) и т. Д. И почему я должен его выбирать?

Любые предложения и ответы высоко оценены.

+1

Я не думаю, что приоритет пула потоков гарантированно сделает эти потоки первыми, поэтому ваш набор деревьев звучит лучше. –

+2

Большинство примеров с исполнителями, которые я видел, используют очереди. Почему бы не использовать 'PriorityQueue' с тем же компаратором? Спросить, что является «лучшим», действительно зависит от вашего использования и рабочей нагрузки, так как нет ни одного ответа, который всегда будет работать для вашей конкретной задачи. – Makoto

+0

@Evan knowles Я сделал оригинальный прототип модели «исполнитель пула потоков» и получил ожидаемые результаты, если вы хотите получить результат, который вы можете посмотреть на примере, представленном в ссылке выше вопроса, которая содержит основной пример метода, и его вывод делает его более описательным –

ответ

0

Наконец получил настоящий победитель из этих двух. Я должен выбрать для Thread pool Executor из следующих соображений стоимости

  1. Производительности: Вот если мы видим, используя максимум ресурсов является основным мотивом, чтобы получить работу во время тяжелого load.So, если мы используем потоки в этом высокое время он будет обеспечить высокую производительность как преимущество многопоточности.
  2. Гибкость: Гибкость с точки зрения масштабируемого использования ресурсов i.e в малое время мы можем уменьшить количество рабочих потоков в архитектуре thread pool executor и наоборот.
  3. меньше числа итераций и минимальных обновления: Если мы сохраним дерево набора каждый раз, когда он будет проверять с помощью comparator интерфейса, хотя он имеет сложность O (LOGN), но после того, что мы должны взять его и его станет последовательным потоком одного источника, поэтому мы не будем использовать преимущества многопоточной среды.
  4. Более быстрая обработка: С помощью архитектуры потоковой обработки мы можем добиться более высокой производительности.

и т. Д. Были причинами, которые я указывал во время тяжелого штурма мозга, поиска в Интернете и последнего, но не наименее сложного поиска переполнения стека. Спасибо вам всем за вашу скромную поддержку и огромную благодарность @didierc за то, что вы меня поняли.

0

Есть два различных понятия приоритета внедренных в вашем вопросе:

  • Отправного приоритет: в каком порядке задачи представлена ​​для исполнения (пункт 1 вашего первого подход объяснения)

  • приоритет выполнения: в каком порядке темы учитываются при планировании (пункт 3)

Эти два свойства оказались одинаковыми в вашем сценарии, поэтому набор деревьев поможет вам определить их оба. Исполнитель поможет вам обеспечить их соблюдение, но вам понадобится специальный пользовательский исполнитель (на основе пула потоков или нет), чтобы начать ваши потоки с определенным приоритетом. В принципе, каждый раз, когда задача вытягивается из очереди приоритетов, она должна быть связана с потоком, установленным на уровне приоритета задачи. Я предполагаю, что это функция, которую реализует реализация исполнителя в статье, которую вы указываете, и, следовательно, что вы делаете.

Что касается пулов потоков, из документации:

Использование рабочих потоков сводит к минимуму накладные расходы за счет создания потока. Объекты Thread используют значительный объем памяти, а в крупномасштабном приложении выделение и освобождение многих объектов потоков создает значительные накладные расходы на управление памятью.

Рабочие потоки - это потоки, управляемые путями потоков, и консервативно перерабатываются (в отличие от уничтоженных и воссозданных) для обработки последовательностей задач. Я не думаю, что это имеет большое значение в отношении приоритетной обработки, но это оптимизирует использование вами ресурсов.

Что касается реализации из статьи, то код использует простой блокирующий деск для обработки входящих задач, следовательно, это простая схема приоритета fifo. Он не изменяет порядок задач.

+1

Точно, функция (приоритет потока такой же, как и задача) реализуется во втором подходе. «древовидный» подход хорош, но мое замешательство связано с временной сложностью, затратами на производительность при загрузке тяжелых задач, гибкостью и т. д., в зависимости от того, какой из них выбрать. –

+0

А, прости, я пропустил этот момент. Я предполагаю, что без конкретных деталей реализации будет сложно оценить их с точки зрения сложности и стоимости. – didierc

0

Вы можете попробовать DelayedQueue в обычном threadpool.

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(size, size, 0, TimeUnit.DAYS, new DelayQueue<>()); 
threadPoolExecutor.execute(runnable); 

Runnable должны быть орудия Сопоставимые. Поэтому в этой реализации приоритет будет зависеть от задержки.

Этот подход будет проще реализовать.

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