Содержание

Пример пула потоков Java с использованием Executors и ThreadPoolExecutor

Пул потоков управляет пулом рабочих потоков, он содержит очередь, которая удерживает задачи, ожидающие выполнения. Пул потоков управляет коллекцией потоков Runnable, а рабочие потоки выполняют Runnable из очереди. java.util.concurrent.Executors обеспечивают реализацию интерфейса java.util.concurrent.Executor для создания пула потоков в java.
Давайте напишем простую программу, чтобы объяснить, как она работает.

Вот тестовая программа, в которой мы создаем фиксированный пул потоков из среды Executors.

В приведенной выше программе мы создаем пул потоков фиксированного размера из 5 рабочих потоков. Затем мы отправляем 10 заданий в этот пул, поскольку размер пула равен 5, он начнет работать на 5 заданиях, а другие задания будут в состоянии ожидания, как только одно из заданий будет завершено, другое задание из очереди ожидания будет быть подхваченным рабочим потоком и выполненным.

Вывод подтверждает, что в пуле есть пять потоков, названных из «pool-1-thread-1? «пул-1-нить-5»? и они несут ответственность за выполнение представленных задач в пул.

Класс Executors обеспечивает простую реализацию ExecutorService с использованием ThreadPoolExecutor, но ThreadPoolExecutor предоставляет гораздо больше возможностей, чем это. Мы можем указать количество потоков, которые будут активны при создании экземпляра ThreadPoolExecutor, и мы можем ограничить размер пула потоков и создать нашу собственную реализацию RejectedExecutionHandler для обработки заданий, которые не помещаются в очередь рабочих.

ThreadPoolExecutor предоставляет несколько методов, с помощью которых мы можем узнать текущее состояние исполнителя, размер пула, количество активных потоков и количество задач. Итак, у меня есть поток монитора, который будет печатать информацию об исполнителе через определенный промежуток времени.

Обратите внимание, что при инициализации ThreadPoolExecutor мы сохраняем начальный размер пула как 2, максимальный размер пула до 4 и размер рабочей очереди равным 2. Поэтому, если есть 4 запущенных задачи и отправлено больше задач, рабочая очередь будет содержать только 2 из них. а остальные из них будут обработаны RejectedExecutionHandlerImpl.

Вот вывод вышеуказанной программы, который подтверждает приведенное выше утверждение.

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

pool-1-thread-1 Start. Command = cmd0

pool-1-thread-4 Start. Command = cmd5

cmd6 is rejected

pool-1-thread-3 Start. Command = cmd4

pool-1-thread-2 Start. Command = cmd1

cmd7 is rejected

cmd8 is rejected

cmd9 is rejected

[monitor] [0/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated:

false

[monitor] [4/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false

pool-1-thread-4 End.

pool-1-thread-1 End.

pool-1-thread-2 End.

pool-1-thread-3 End.

pool-1-thread-1 Start. Command = cmd3

pool-1-thread-4 Start. Command = cmd2

[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false

[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false

pool-1-thread-1 End.

pool-1-thread-4 End.

[monitor] [4/2] Active: 0, Completed: 6, Task: 6, isShutdown:

false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false

[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true

[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown:

true, isTerminated: true

Обратите внимание на изменение количества активных, выполненных и общих выполненных задач исполнителя. Мы можем вызвать метод shutdown (), чтобы завершить выполнение всех представленных задач и завершить пул потоков.

Ссылка: Пример пула потоков Java с использованием Executors и ThreadPoolExecutor от нашего партнера по JCG Панкаджа Кумара в блоге Developer Recipes .

Пул потоков — Thread pool

Образец пула потоков (зеленые поля) с ожидающими задачами (синий) и завершенными задачами (желтый)

В компьютерное программирование, а пул потоков это шаблон разработки программного обеспечения для достижения параллелизм исполнения в компьютерной программе. Часто также называют реплицированные рабочие или же модель рабочий-бригада,[1] пул потоков поддерживает несколько потоки ожидать задачи быть выделенным для одновременный исполнение контролирующей программой. Поддерживая пул потоков, модель увеличивает производительность и позволяет избежать задержек при выполнении из-за частого создания и уничтожения потоков для краткосрочных задач. [2] Количество доступных потоков настраивается на вычислительные ресурсы, доступные программе, например очередь параллельных задач после завершения выполнения.

Содержание

  • 1 Спектакль
  • 2 Смотрите также
  • 3 Рекомендации
  • 4 внешняя ссылка

Спектакль

Размер пула потоков — это количество потоков, хранящихся в резерве для выполнения задач. Обычно это настраиваемый параметр приложения, настроенный для оптимизации производительности программы.[3] Выбор оптимального размера пула потоков имеет решающее значение для оптимизации производительности. Метод анализа пула потоков (HTA) на основе гиперболы был предложен для определения оптимального размера пула потоков для процесса индексирования в облаке на основе доступной рабочей нагрузки и пропускной способности.[4]

Одним из преимуществ пула потоков перед созданием нового потока для каждой задачи является то, что накладные расходы на создание и уничтожение потоков ограничиваются первоначальным созданием пула, что может привести к улучшению спектакль и лучшая система стабильность. Создание и уничтожение потока и связанных с ним ресурсов может быть дорогостоящим с точки зрения времени процессом. Однако чрезмерное количество резервных потоков расходует память, а переключение контекста между выполняемыми потоками приводит к снижению производительности. Соединение сокета с другим сетевым хостом, для разрыва и восстановления которого может потребоваться много циклов ЦП, можно поддерживать более эффективно, связывая его с потоком, который существует в течение более чем одной сетевой транзакции.

Использование пула потоков может быть полезно, даже если отложить время запуска потока. Существуют реализации пулов потоков, которые упрощают постановку работы в очередь, контроль параллелизма и синхронизацию потоков на более высоком уровне, чем это можно легко сделать при ручном управлении потоками.[5][6] В этих случаях преимущества использования могут быть вторичными.

Обычно пул потоков выполняется на одном компьютере. Однако пулы потоков концептуально связаны с серверные фермы в котором главный процесс, который сам может быть пулом потоков, распределяет задачи по рабочим процессам на разных компьютерах, чтобы увеличить общую пропускную способность. Смущающе параллельный проблемы легко поддаются этому подходу.[нужна цитата ]

Количество потоков можно динамически регулировать в течение срока службы приложения в зависимости от количества ожидающих задач. Например, веб сервер может добавлять темы, если их много страница в Интернете поступают запросы и могут удалять потоки, когда эти запросы сокращаются.[оспаривается – обсуждать] Стоимость большего пула потоков — увеличение использования ресурсов. Алгоритм, используемый для определения того, когда создавать или уничтожать потоки, влияет на общую производительность:

  • Создание слишком большого количества потоков тратит впустую ресурсы и требует времени на создание неиспользуемых потоков.
  • Для уничтожения слишком большого количества потоков потребуется больше времени при их повторном создании.
  • Слишком медленное создание потоков может привести к снижению производительности клиента (длительное время ожидания).
  • Слишком медленное уничтожение потоков может привести к нехватке ресурсов для других процессов. «GitHub — vit-vit / CTPL: современная и эффективная библиотека пула потоков C ++». 2019-09-24.
  • внешняя ссылка

    • «Запрос по фрагменту, параллельному выполнению и соединению: шаблон пула потоков в Java «Бинилдас К. А.
    • «Пулы потоков и рабочие очереди «Брайан Гетц
    • «Метод объединения рабочих потоков «Прадип Кумар Саху
    • «Очередь работы «Ури Твиг: демонстрация кода C ++ объединенных потоков, выполняющих рабочую очередь.
    • «Объединение потоков Windows и цепочка выполнения «
    • «Пул умных потоков «Автор: Ами Бар
    • «Программирование пула потоков в .NET Framework «Дэвид Кармона
    • «Пул потоков и асинхронные методы «Джон Скит
    • «Создание уведомляющего пула блокирующих потоков в Java «Амир Кирш
    • «Практическое многопоточное программирование на Python: пулы потоков и очереди «автор: Noah Gift
    • «Оптимизация стратегий пула потоков для CORBA в реальном времени «Ирфан Пьярали, Марина Спивак, Дуглас С. Шмидт и Рон Ситрон
    • Документ конференции »Отложенная отмена. Образец поведения «Филипп Бахманн

    Многопоточность Java: определение, пулы, функции и особенности

    Многопоточность Java незаменима тогда, когда в программе нужно организовать одновременную работу разного функционала. Например, нужно, чтобы в программе в момент скачивания какого-либо файла из интернета можно было взаимодействовать с меню, заполнять форму, общаться в чате и др. Все это отдельные потоки работы одной программы.

    Многопоточность Java также активно используется при разработке игр, когда нужно, чтобы одновременно происходила обработка физики, игра в сети, голосовое общение игроков и др.

    Многопоточность Java и других языков стала активно применяться примерно в начале 2000-х. В это время стали появляться многоядерные компьютеры, которые управлялись тремя известными операционными системами: Windows, Linux, MacOS. Таким образом, у программистов появилась возможность распределять работу программы на несколько ядер. Причем распределение работы происходит в параллельном режиме, благодаря чему появилась такая модель программирования, как «параллельное программирование».

    Многопоточность Java

    На самом деле, многопоточность Java — это сложная тема со множеством нюансов и тонкостей. Сегодня мы лишь приоткроем занавес в мир многопоточности и параллельного программирования, поэтому начнем с азов.

    Программный процесс — это программный код и информация, необходимая для его выполнения. Операционная система каждому процессу выделяет определенное количество памяти, время ядра процессора и другие ресурсы. Под каждый отдельный процесс ОС выделяет виртуальное адресное пространство. Обычно одна запущенная на компьютере программа является одним процессом в операционной системе. Все процессы изолированы друг от друга, поэтому из одного процесса практически невозможно получить доступ к памяти другого процесса — для этого нужны специальные инструменты и знания.

    При старте любой программы на устройстве операционная система создает отдельный процесс, куда загружается программный код и информация, необходимая для работы программы. После запуска процесса запускается поток исполнения программы. Поток в процессе может быть один, но также их может быть несколько. 

    Что такое поток и многопоточность Java

    Программа или процесс может исполняться в едином потоке. Так программировали раньше, когда компьютеры были одноядерными. В одноядерном компьютере не было смысла запускать многопоточные программы, потому что их обрабатывало одно ядро процессора, а ядро процессора обрабатывает все поступающие команды последовательно.

    Но когда появились многоядерные компьютеры, тогда открылась возможность задействовать несколько ядер компьютеров для выполнения одной программы или процесса. Для этого всего-то нужно распараллелить выполнение программы, то есть создать в ней несколько параллельных потоков выполнения. Таким образом, получается, что поток — это отдельная часть исполняемого кода. На деле же поток является отдельной функцией какой-либо программы.

    Если представить, что какой-нибудь канат является процессом, тогда каждая его отдельная нить будет являться потоком, а сам канат можно назвать многопоточным. Кстати, в программировании поток иногда называют «нитью».

    Таким образом, можно заключить, что многопоточность в Java — это способность языка организовать параллельное выполнение единой программы в многоядерном устройстве. Многопоточность программы не появляется спонтанно — ее реализует программист собственными усилиями. То есть, если программист не разрабатывает программу в многопоточном режиме, тогда она будет работать в едином потоке. А это значит, что все инструкции в программе будут выполняться последовательно. На деле это может оказаться так: вы запустили в какой-то программе скачивание файла из интернета, и пока скачивание не завершится, вы не сможете взаимодействовать с программой.

    Многопоточность Java и многопоточность ядра компьютера

    Не нужно путать многопоточность Java и многопоточность ядра. Многопоточность Java — это особенность языка, которая позволяет реализовать параллельное исполнение программы. А многопоточность ядра — это способность ядра обрабатывать программу в несколько потоков.

    Чуть выше мы писали, что многопоточность бессмысленна в одноядерном компьютере. Это утверждение верно, если одно ядро компьютера поддерживает выполнение одного потока инструкций. В этом случае все инструкции «выстраиваются» в очередь и выполняются в порядке очереди или приоритетности. 

    Однако производители процессоров продвинулись в собственном производстве. Уже давно не редкость, когда одно ядро процессора способно обрабатывать инструкции в несколько потоков. Это свойство называется многопоточностью ядра. В этом случае одноядерный компьютер будет способен обработать многопоточную программу. Многопоточность ядра позволяет при меньшем количестве ядер обрабатывать больше инструкций, а значит, делать компьютеры быстрее.  

    Например, компьютер имеет 2 ядра, а каждое из ядер имеет по 4 потока. Таким образом, двухядерный компьютер может обработать 8 потоков инструкций. Однако не нужно путать количество ядер и количество потоков в ядре. Двухядерный компьютер с 8-ю потоками будет работать менее производительней, чем 8-ядерный компьютер с одним потоком в ядре.

    Многопоточность Java и пул потоков

    Многопоточность Java помогает ускорить работу программ за счет того, что программа исполняется параллельно. Однако, когда программа относительно небольшая, тогда управлять потоками несложно. Но что делать, когда программа на Java становится реально большой и с огромным количеством потоков? Управлять потоками в такой программе довольно сложно, поэтому был придуман пул потоков в Java.

    Пул потоков Java — это своего рода «контейнер» для потоков. Потоки в одном пуле могут выполнять разные задачи, но вся прелесть в том, что управление происходит пулом, а не потоками, то есть в исполнение запускается пул потоков. Таким образом, потоки в пуле самостоятельно выстраиваются в очередь, и после исполнения одного потока следующий начинает исполняться самостоятельно.

    Пул потоков в Java дает возможность разделить программу по функциональности. То есть в отдельном пуле находятся потоки, выполняющие определенную задачу. Благодаря пулам многопоточность Java применяется эффективнее.

    Заключение

    Многопоточность Java — это не веяние программистской моды, а возможность разрабатывать более эффективные программы. Большинство современных устройств многоядерные или многопоточные. В многоядерном устройстве запускать однопоточную программу — это неэффективное использование ресурсов устройства. Если устройство способно выполнять программу в несколько потоков, тогда почему не воспользоваться такой возможностью?

    9. Использование Thread и Runnable. Пул потоков, назначение и принципы реализации

    Система многопоточности в Java построена на основе класса Thread и сопутствующего ему интерфейса Runnable. Класс Thread инкапсулирует поток выполнения. Чтобы создать новый поток, программа будет или реализ. интерфейс, или расширять класс Thread. И интерфейс, и класс нах-ся в пакете java.lang, => автоматически доступны всем программам.

    Интерфейс Runnable абстрагирует модуль исполняемого кода. Можно создать поток в любом объекте, который реализует данный интерфейс. Runnable определяет только один метод void run(), внутри которого определяется код, образующий новый поток. Метод run() может вызвать другие методы, исп. другие классы и объявлять переменные; метод уст. точку входа для другого, параллельного потока выполнения внутри программы. Поток завершится, когда метод run() вернет рез-т. Класс Thread инкапсулирует поток. Thread опр. несколько методов, которые помогают управлять потоками. Метод start() вызывает метод run(), опр. в интерфейсе. Метод sleep() приостанавливает выполнение потока на опред. момент времени. Когда поток «спит», другой может выполнять свою работу, пока спящий не проснется.   Класс Thread опр-ет два набора конструкторов: один для создания потока в отдельном экземпляре класса Runnable, другой для создания потока в классах, расш. класс Thread. Для обоих наборов конструкторов поток будет создан как поток пользователя, если не оговорено иного.

    Чтобы создать поток посредством реализации интерфейса Runnable, нужно: 1) Создать класс, реализ. интерфейс. 2) внутрь метода run(), опред. интерфейсом, поместить код, который должен вып-ся в потоке. 3) Создать экземпляр класса Runnable. 4) Создать объект Thread, передавая его в экземпляр Runnable. 5) Начать выполнение потока посредством метода start() на экземпляре Thread.

    Чтобы создать поток посредством расширения класса  Thread, нужно: 1) Создать класс, который будет расширять Thread. 2) Переопределить метод run(), специфицировав код, который будет вып-ся в потоке. 3) Создать экземпляр класса, расш. Thread. 4) Начать вып-ние потока, вызвав метод start() на экземпляре.

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

    Хотя пул потоков — мощный механизм для структурирования многопоточных приложений, он связан с определенным риском. Приложения, построенные при помощи пулов потоков, подвержены всем тем параллельным рискам, что и любое другое многопоточное приложение, как, например, ошибки синхронизации и взаимоблокировка, и также нескольким другим рискам, специфических также для пулов потоков, таких, как зависимая от пулов взаимоблокировка, пробуксовка ресурсов и рассеяние потока. Одно из преимуществ пулов потоков состоит в том, что они обычно хорошо выполняют операции, имеющие отношение к альтернативным распределяющим механизмам, но это верно только в том случае, если размер пула потоков настроен правильно. Потоки потребляют многочисленные ресурсы, включая память и другие системные ресурсы. Кроме памяти, требующейся для объекта Thread, каждый поток требует двух списков вызовов выполнения, которые могут быть большими. В дополнение к этому, JVM, возможно, создаст «родной» поток для каждого Java-потока, что связано с потреблением дополнительных системных ресурсов. Наконец, поскольку распределяющиеся издержки переключения между потоками малы, для многих потоков переключение процессов может стать значительным замедлением в работе программы. Если пул потоков слишком велик, ресурсы, потребляемые этими потоками, могут в значительной степени повлиять на работу системы. Время будет напрасно потрачено на переключение между потоками, и если потоков больше, чем необходимо, это может вызвать проблемы ресурсного голодания, так как потоки пулов потребляют ресурсы, которые могли бы быть более эффективно использованы другими задачами. Существенный риск в самых разных пулах потоков заключается в утечке потока, которая случается, когда поток удаляется из пула для выполнения задачи, но не возвращается в пул, когда задача выполнена. Во-первых, это происходит, когда задача выдает RuntimeException или Error. Если класс пула их не воспринимает, тогда поток просто прекращается и размер пула потоков сокращается на один. Когда это произойдет достаточное количество раз, пул потоков окажется пустым, и система заблокируется, потому, что нет потоков, доступных для осуществления задач. Задачи, которые постоянно блокируются, например, те, что потенциально ждут ресурсов, которые могут и не стать доступными, или ждут ввода со стороны пользователя, который, возможно, ушел домой, могут также вызвать эффект, эквивалентный утечке потока. Если поток постоянно занимается такой задачей, он фактически удален из пула. Таким задачам следует либо выделять собственный поток, либо ограничить время ожидания. Пул потока — полезный инструмент для организации серверов приложений. Он довольно простой по сути, но есть некоторые моменты, с которыми следует быть осторожными во время применения и использования, такие как взаимоблокировка, пробуксовка ресурсов, и сложности, связанные с wait() и notify(). Если требуется пул потоков для приложения, рассмотрите использование одного из классов Executor из util.concurrent, такой как PooledExecutor, вместо создания нового с нуля.

    Оптимизация Glassfish — настройка пула потоков

    Одной из самых важных этапов оптимизации сервера приложений Glassfish является настройка пула потоков обработки запросов (Thread Pool).

    1. Предисловие

    Толчком к написанию данной статьи стало появление назойливого сбоя в работе приложения.
    Признаки сбоя заключались в следующем:

    • временами при обращении к веб-приложению запрос подвисал на неопределенный промежуток времени, потом все начинало работать нормально до следующего зависания;
    • в логе сервера приложений временами проскакивала следующая ошибка:
    
    [#|2013-04-09T11:26:37.615+0400|FINE|glassfish4.1|com.sun.grizzly.config.GrizzlyServiceListener|_ThreadID=48;_ThreadName=Thread-1;ClassName=com. sun.grizzly.filter.ReadFilter;MethodName=log;|ReadFilter.execute
    java.nio.channels.ClosedChannelException
    	at sun.nio.ch.SocketChannelImpl.ensureReadOpen(SocketChannelImpl.java:236)
    	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:279)
    	at com.sun.grizzly.filter.ReadFilter.execute(ReadFilter.java:165)
    	at com.sun.grizzly.filter.ReadFilter.execute(ReadFilter.java:107)
    	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    	at com. sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    	at java.lang.Thread.run(Thread.java:722)
    |#]
    

    Для выявления причин и исправления ситуации были проведены следующие действия:

    1. Снятие дампа потоков сервера приложений Glassfish в момент зависания приложения:
      
      bash> asadmin --port=9010 --user=admin –passwordfile=path generate-jvm-report --type=thread
      Full Java Thread Dump Java HotSpot(TM) 64-Bit Server VM 23.1-b03 Oracle Corporation
      Number of threads: 64
      Number of daemon threads: 53
      Peak live thread count since the Java virtual machine started or peak was reset: 88
      …
      Thread "http-thread-pool-8080(5)" thread-id: 41 thread-state: RUNNABLE Running in native
      	 … org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate. java:441)
      	 …
      Thread "http-thread-pool-8080(4)" thread-id: 40 thread-state: RUNNABLE Running in native
      	… org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441)
      	…
      Thread "http-thread-pool-8080(3)" thread-id: 39 thread-state: RUNNABLE Running in native
      	 … org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441)
      	 …
      Thread "http-thread-pool-8080(2)" thread-id: 38 thread-state: RUNNABLE Running in native
      	 … sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
      	 at: java.net.URL.openStream(URL.java:1035)
      	 …
      Thread "http-thread-pool-8080(1)" thread-id: 37 thread-state: RUNNABLE Running in native
      	 … org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441)
      	…
      Command generate-jvm-report executed successfully.
      
    2. Анализ дампа потоков.
      Анализ выявил, что из 5 потоков в пуле 4 были заняты ожиданием ответа от СУБД, а 1 поток был занят ожиданием ответа от запроса к серверу приложений Glassfish, что и вызывало взаимную блокировку. Обращение к сервере приложений уже не могло быть обработано, поскольку все 5 потоков были заняты и поэтому зависание продолжалось до истечения срока пребывания запроса в очереди.
    3. Выявление запросов в СУБД, результатов которых ожидали потоки.
    4. Исправление возникшей ситуации:
      1. Настройка максимального количества одновременно выполняющихся потоков.
      2. Оптимизация запросов к БД.

    P.S. Исключение java.nio.channels.ClosedChannelException, выбрасываемое в лог сервера приложений возникало в случае, когда пользователь, не дождавшись ответа, закрывал браузер, а сервер приложений по истечении таймаута пытался закрыть соединение, которое уже было закрыто пользователем.

    2. О потоках

    Под потоком понимается поток выполнения в виртуальной Java машине.
    Glassfish, в целях повышения производительности, управляет несколькими пулами потоков.
    Пул потоков — это группа потоков с уникальным наименованием. Каждый пул может быть назначен различным коннекторам и обработчикам. Например, один пул для обработки http запросов, другой для обработки запросов к консоли администрирования и т.п.

    3. Обработка запросов Обработка запросов в сервере Glassfish строится по следующей схеме:

    1. Glassfish получает запрос от клиента
    2. Проверяется наличие свободного потока выполнения в пуле потоков.
    3. Свободный поток — это поток, который находится в состоянии ожидания. Его состояние обозначается статусом TIMED_WAITING.
    4. Если свободный поток обнаруживается, то обработка запроса отдается этому потоку, и его статус меняется на RUNNING.
    5. Иначе запрос ставится в очередь ожидания свободного потока. Если по истечении определенного периода времени запросу так и не будет выделен поток выполнения, то этот запрос удаляется из очереди.
    6. После обработки запроса поток вновь переходит в состояние ожидания. Стоит отметить, что если во время обработки запроса происходят какие-либо время затратные операции: обработка запросов БД, ожидание ввода/вывода, то поток остается в состоянии RUNNING и не освобождается для выполнения других запросов.

    4. Настройка пула потоков

    Настройку пула потоков можно производить двумя способами:
    • либо через файл описания настроек домена domain.xml.
    • либо динамически через утилиту asadmin.
    Описание команд динамической настройки находится в руководстве администратора:
    http://docs.oracle.com/cd/E18930_01/html/821-2416/abluc.html#scrolltoc

    5. Опции пула потоков:

    Опция Описание По умолчанию
    maxthreadpoolsize Максимальное количество параллельно выполняющихся потоков 5
    minthreadpoolsize Минимальное количество потоков, находящихся в пуле 2
    idletimeout Количество секунд, которое неактивные потоки находятся в пуле. По прошествии этого времени, неактивные потоки удаляются из пула 900
    maxqueuesize Максимальное количество запросов, которое может находится в очереди, ожидая пока они будут обработаны потоками пула 4096

    6. Оптимизация

    Задача оптимизации заключается в выборе подходящего под наше приложение набора значений опций.

    В принципе, основной опцией, которую следует настраивать, является опция «maxthreadpoolsize».
    Опция «maxthreadpoolsize» описывает максимальное количество запросов, которые могут быть обработаны параллельно.
    Значение данной опции зависит от характера обработки запросов нашим приложением:

    • Если запросы выполняются длительное время и во время обработки выполняют обращения к системе ввода/вывода или к СУБД, то может потребоваться увеличение количества максимального количества параллельно выполняющихся запросов.
    • Если же мы имеем дело с большим количеством запросов, обработка, которых ложится целиком на сам сервер приложений, то параллельное выполнение большого количества может вызвать высокую нагрузку на CPU и может понадобиться уменьшение максимального количества параллельно выполняющихся запросов.

    В документации по настройке производительности сервера приложений Glassfish говорится о допустимом интервале значения данной опции от 100 до 500, в зависимости от нагрузки.

    Также разумно выставлять значение максимального количества параллельно выполняющихся запросов кратным числу процессоров.

    Просмотреть число процессоров можно командой:

    
    bash> cat /proc/cpuinfo | grep processor
    processor       : 0
    processor       : 1
    processor       : 2
    processor       : 3
    

    7. Ход оптимизации

    В задачу оптимизации в прочем входит настройка параметра максимального количества параллельно выполняющихся запросов и последующий мониторинг состояния сервера с последующей регулировкой значения.

    Ход работ по оптимизации может состоять из следующих действий:

    1. Включение мониторинга:
      
      asadmin> enable-monitoring --modules http-service=HIGH
      
    2. Проверка значения количества доступных потоков в пуле и количества работающих потоков в данный момент времени соответственно:
      
      asadmin> get –monitor server. network.http-listener-1.thread-pool.currentthreadcount-count
      asadmin> get –monitor server.network.http-listener-1.thread-pool.currentthreadsbusy-count
      
    3. Проверка нагрузки на CPU:
      
      bash> vmstat
      procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
       r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
       1  0  11916 469756 4039780 3478788    0    0    25   110    0    1  0 24 72  3
      
      Параметр «id» указывает на процент времени нахождения процессора в состоянии покоя.
    4. Изменение значения параметра maxthreadpoolsize в зависимости от полученных результатов на предыдущих шагах:
      
      asadmin> set server.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size=16
      Command set executed successfully
      

    8. Мониторинг

    После первоначальной настройки сервера приложений Glassfish необходимо настроить регулярный мониторинг его состояния и реагировать на критические моменты, но это уже материал для другой статьи.

    Что такое пул потоков?

    Обзор

    Мы используем потоки в операционных системах для обеспечения параллельной обработки задач и увеличения пропускной способности нашей системы. Пул потоков — это набор рабочих потоков, которые эффективно выполняют асинхронные обратные вызовы от имени приложения. Пул потоков в основном используется для уменьшения количества потоков приложений и обеспечения управления рабочими потоками. Приложения могут ставить рабочие элементы в очередь, связывать работу с дескрипторами ожидания, автоматически ставить в очередь на основе таймера и связываться с вводом-выводом.

    Scope

    В статье рассказывается о том, что такое пул потоков, об архитектуре пула потоков и о том, как он реализован в Java. В этой статье не рассматриваются низкоуровневые сведения о том, как реализованы пулы потоков, и не рассматривается динамическая точная настройка пула потоков.

    Что такое пул потоков?

    Как следует из названия, пул потоков — это пул или набор потоков.

    Давайте рассмотрим пример книжной библиотеки, чтобы лучше понять пулы потоков. Пользователь приходит в библиотеку и запрашивает книгу, если книги нет в библиотеке, ее необходимо сначала купить, прежде чем выделить ее пользователю. Однако, если библиотека заранее предвидит, что на книгу будет спрос, и хранит книгу до того, как какой-либо пользователь запросит ее, она может сэкономить на задержке покупки книги. Как только пользователь посещает библиотеку, ему может быть немедленно выделена книга. После потребления книга будет возвращена в библиотеку, готовая для передачи другим пользователям

    Та же концепция может быть применена к потокам. Предположим, у нас есть две задачи T1 и T2, которые необходимо выполнить одну за другой. T1 запрашивает у компилятора/приложения создание потока, в котором задача может выполняться, компилятор создает его, T1 выполняет свою обработку, а затем компилятор уничтожает его. Теперь T2 должен обработать, те же процессы происходят снова. Общее время вычислений выглядит следующим образом:

    t(T1)+t(T2)+2*creationTimeOfThread+2*destructionTimeOfThreadt(T1) + t(T2) + 2 * createTimeOfThread + 2 * DestructionTimeOfThreadt(T1)+t( T2)+2∗созданиеTimeOfThread+2∗уничтожениеTimeOfThread

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

    Архитектура пула потоков

    На следующей диаграмме показано, как работает пул потоков.

    В пуле 3 потока: T1, T2 и T3.

    Service1 и Service2 запрашивают поток из пула потоков, и им выделяются потоки T1 и T2 соответственно

    Service3 завершил свой запрос и готов вернуть поток T3 в пул

    У службы 4 есть запрос, но, поскольку в пуле нет доступных потоков, его запрос не может быть обслужен. Запрос будет помещен в очередь ожидания

    Пул потоков в Java

    В Java пул потоков создается с помощью ExecutorService

     
     ExecutorService executorService = Executors.newFixedThreadPool(3)
     

    Это создаст пул из 3 потоков

    С помощью функции execute() можно запросить поток из executorService

     
     класс TaskThread реализует Runnable {
        публичный недействительный запуск () {
            // Выполнять работу()
        }
    }
    
    Запускаемый taskThread = новый TaskThread()
    executorService. execute(taskThread)
     

    Идеальный пул потоков

    Сколько потоков должно присутствовать в пуле? Давайте сначала разберемся с крайними случаями

    • Если мы создадим много потоков в пуле, мы столкнемся с высоким использованием памяти и снижением производительности приложения
    • Если мы создадим слишком мало потоков, мы не получим преимущества использования пула потоков

    В Java есть интересный способ создания пула потоков с помощью Executors.newChachedThreadPool(). Эта реализация создает начальный пул из нулевых потоков, всякий раз, когда возникает потребность, создаются и добавляются в пул дополнительные потоки. Потоки, которые простаивают более 60 секунд, удаляются из пула

    Можно управлять такими параметрами, как количество потоков в пуле, TTL неактивных потоков. Мы можем создать экземпляр пула с начальным количеством потоков, и при необходимости дополнительные потоки будут создаваться динамически

    Как узнать количество начальных потоков?
    Существует формула для вычисления идеального количества потоков, которое должно быть в вашем пуле:

    Количество потоков = количество доступных ядер*(1+время ожидания/время обслуживания)Количество потоков = количество доступных ядер * (1 + время ожидания/время обслуживания)Количество потоков =NumberofAvailableCores*(1+Waittime/Servicetime)

    Время ожидания: общее время, затрачиваемое на отсутствие обработки, например операции ввода-вывода, сетевые вызовы Время обслуживания: Фактическое время обработки

    Например, в четырехъядерном ЦП, если микрослужба тратит 500 мс на операции ввода-вывода и 50 мс на фактические вычисления,

    numberOfhreads=4∗(1+500/50)=44numberOfhreads = 4 * (1 + 500/50) = 44numberOfhreads=4*(1+500/50)=44

    Заключение

    • Пулы потоков позволяют создавать несколько потоков при запуске приложения
    • Пул потоков управляет созданием, размещением и уничтожением потоков
    • В Java есть класс ExecutorService, который управляет пулами потоков
    • Пользователь может контролировать, сколько потоков может присутствовать в пуле потоков, используя Executors. newChachedThreadPool() реализацию ExecutorService
    • Не следует создавать много потоков в пуле, это приведет к повышенному использованию памяти и снижению производительности в целом. Это также может повлиять на время запуска приложения
    • .
    • Как правило, мы можем использовать формулу Количество потоков = количество доступных ядер * (1 + время ожидания / время обслуживания) для расчета количества потоков, необходимых в пуле

    Время испытаний!

    Время проверить свои навыки и выиграть награды!

    Примечание. Награды будут начислены после следующего обновления продукта.

    Пулы потоков — приложения Win32

    Редактировать

    Твиттер LinkedIn Фейсбук Эл. адрес

    • Статья
    • 4 минуты на чтение

    Пул потоков — это набор рабочих потоков, которые эффективно выполняют асинхронные обратные вызовы от имени приложения. Пул потоков в основном используется для уменьшения количества потоков приложений и обеспечения управления рабочими потоками. Приложения могут ставить рабочие элементы в очередь, связывать работу с дескрипторами ожидания, автоматически ставить в очередь на основе таймера и связываться с вводом-выводом.

    Архитектура пула потоков

    Следующие приложения могут извлечь выгоду из использования пула потоков:

    • Приложение с высоким уровнем параллелизма, которое может асинхронно отправлять большое количество небольших рабочих элементов (например, поиск по распределенному индексу или сетевой ввод-вывод). .
    • Приложение, которое создает и уничтожает большое количество потоков, каждый из которых выполняется в течение короткого времени. Использование пула потоков может уменьшить сложность управления потоками и накладные расходы, связанные с созданием и уничтожением потоков.
    • Приложение, которое обрабатывает независимые рабочие элементы в фоновом режиме и параллельно (например, загрузка нескольких вкладок).
    • Приложение, которое должно выполнять монопольное ожидание объектов ядра или блокировать входящие события для объекта. Использование пула потоков может упростить управление потоками и повысить производительность за счет уменьшения количества переключений контекста.
    • Приложение, которое создает пользовательские потоки ожидания для ожидания событий.

    Исходный пул потоков был полностью изменен в Windows Vista. Новый пул потоков улучшен, поскольку он предоставляет один тип рабочего потока (поддерживает как ввод-вывод, так и не ввод-вывод), не использует поток таймера, предоставляет единую очередь таймера и предоставляет выделенный постоянный поток. Он также предоставляет группы очистки, более высокую производительность, несколько пулов для каждого процесса, которые планируются независимо, и новый API пула потоков.

    Архитектура пула потоков состоит из следующего:

    • Рабочие потоки, выполняющие функции обратного вызова
    • Потоки ожидания, ожидающие нескольких дескрипторов ожидания
    • Рабочая очередь
    • Пул потоков по умолчанию для каждого процесса
    • Рабочая фабрика, управляющая рабочими потоками

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

    Новый API пула потоков обеспечивает большую гибкость и контроль, чем исходный API пула потоков. Однако есть несколько тонких, но важных отличий. В исходном API сброс ожидания был автоматическим; в новом API ожидание должно каждый раз явно сбрасываться. Исходный API автоматически обрабатывал олицетворение, передавая контекст безопасности вызывающего процесса потоку. В новом API приложение должно явно задавать контекст безопасности.

    Ниже приведены рекомендации по использованию пула потоков:

    • Потоки процесса совместно используют пул потоков. Один рабочий поток может выполнять несколько функций обратного вызова по одной за раз. Эти рабочие потоки управляются пулом потоков. Поэтому не завершайте поток из пула потоков, вызывая TerminateThread в потоке или вызывая ExitThread из функции обратного вызова.

    • Запрос ввода-вывода может выполняться в любом потоке в пуле потоков. Для отмены ввода-вывода в потоке пула потоков требуется синхронизация, поскольку функция отмены может выполняться в потоке, отличном от того, который обрабатывает запрос ввода-вывода, что может привести к отмене неизвестной операции. Чтобы избежать этого, всегда предоставляйте OVERLAPPED Структура, с которой был инициирован запрос ввода-вывода при вызове CancelIoEx для асинхронного ввода-вывода, или используйте собственную синхронизацию, чтобы убедиться, что никакой другой ввод-вывод не может быть запущен в целевом потоке до вызова CancelSynchronousIo или Функция CancelIoEx .

    • Очистите все ресурсы, созданные в функции обратного вызова, перед возвратом из функции. К ним относятся TLS, контексты безопасности, приоритет потока и регистрация COM. Функции обратного вызова также должны восстанавливать состояние потока перед возвратом.

    • Сохранять дескрипторы ожидания и связанные с ними объекты до тех пор, пока пул потоков не просигнализирует о завершении работы с дескриптором.

    • Отметьте все потоки, ожидающие длительных операций (например, очистку ввода-вывода или очистку ресурсов), чтобы пул потоков мог выделить новые потоки, а не ждать этого.

    • Перед выгрузкой библиотеки DLL, использующей пул потоков, отмените все рабочие элементы, ввод-вывод, операции ожидания и таймеры и дождитесь завершения выполнения обратных вызовов.

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

    • Не ставьте в очередь слишком много элементов слишком быстро в процессе с другими компонентами, использующими пул потоков по умолчанию. Для каждого процесса существует один пул потоков по умолчанию, включая Svchost.exe. По умолчанию каждый пул потоков имеет не более 500 рабочих потоков. Пул потоков пытается создать дополнительные рабочие потоки, когда количество рабочих потоков в состоянии готовности/выполнения должно быть меньше количества процессоров.

    • Избегайте однопотоковой модели апартамента COM, так как она несовместима с пулом потоков. STA создает состояние потока, которое может повлиять на следующий рабочий элемент для потока. STA, как правило, долгоживущий и имеет сходство потоков, что противоположно пулу потоков.

    • Создайте новый пул потоков для управления приоритетом и изоляцией потоков, создания настраиваемых характеристик и, возможно, повышения скорости отклика. Однако для дополнительных пулов потоков требуется больше системных ресурсов (потоки, память ядра). Слишком большое количество пулов увеличивает вероятность конкуренции за ЦП.

    • Если возможно, используйте ожидаемый объект вместо механизма на основе APC для сигнализации потока пула потоков. APC не так хорошо работают с потоками пула потоков, как другие механизмы сигнализации, поскольку система контролирует время жизни потоков пула потоков, поэтому поток может быть завершен до доставки уведомления.

    • Используйте расширение отладчика пула потоков, !tp. Эта команда имеет следующее использование:

      • пул адрес флаги
      • объект адрес флаги
      • tqueue адрес флаги
      • официант адрес
      • рабочий адрес

      Для пула, официанта и рабочего, если адрес равен нулю, команда выгружает все объекты. Для официанта и рабочего отсутствие адреса приводит к сбросу текущего потока. Определены следующие флаги: 0x1 (однострочный вывод), 0x2 (члены дампа) и 0x4 (дамп рабочей очереди пула).

    API пула потоков

    Использование функций пула потоков

     

     

    Пул потоков в Java — Пул потоков Java

    В Java пул потоков — это группа потоков, которые мы можем повторно использовать для различных задач в многопоточной среде. Пул потоков может иметь фиксированный размер, когда каждый поток выполняет задачу и после завершения снова возвращается в пул. Таким образом, каждый поток может выполнять более одной задачи. Это снижает накладные расходы на создание нескольких потоков для разных задач. Мы также можем ограничить количество активных потоков, создав пул потоков фиксированного размера. Java содержит встроенный пул потоков под названием ThreadPoolExecutor, который мы подробно обсудим в этой статье.

    Java имеет встроенный класс пула потоков с именем ThreadPoolExecutor , который реализует интерфейс Executor и субинтерфейс ExecutorService . Чтобы использовать это, нам нужно реализовать объект Runnable и передать его исполнителю, который выполнит задачу. Объект ExecutorService содержит набор задач, которые мы хотим обработать. Пул потоков Java инициализирует размер пула, и потоки последовательно выполняют задачи по мере его освобождения.

    На приведенном выше рисунке у нас есть ThreadBolockingQueue с 5 задачами, ожидающими выполнения в очереди. Пул потоков имеет фиксированный размер 3 потока. Каждый поток выполняет по 1 задаче за раз, и когда поток освобождается, он последовательно берет на выполнение следующую доступную задачу.

    На диаграмме ниже видно, что потоки 1, 2 и 3 выполняют задачи 1, 2 и 3. Тем временем задачи 4 и 5 ждут в очереди, пока любой из потоков не завершит выполнение. Когда какой-либо поток простаивает, он выбирает следующую задачу из очереди и завершает выполнение.

    Ниже приведены основные методы класса Executor, который является частью интерфейса java.util.concurrent.Executors .

    Ниже приведен простой пример использования метода newFixedThreadPool класса ThreadPoolExecutor . Класс SampleTask выполняет задачу, в которой он печатает имя задачи и некоторое случайное значение.

    Класс FixedThreadPoolDemo — это основной класс, в котором мы выполняем все задачи, используя пул потоков фиксированного размера в Java. Мы создаем пул потоков, используя newFixedThreadPool метод, который инициализирует размер до 3. Затем мы создаем 5 задач, где эти 3 потока выполняют все 5 задач по мере доступности потока.

    Всякий раз, когда мы хотим повторно выполнить одну и ту же задачу после фиксированной задержки, мы можем использовать метод newScheduledThreadPoolExecutor класса ThreadPoolExecutor. В приведенном ниже примере мы создаем запланированный пул потоков Java размером 3 и повторно выполняем одну и ту же задачу, которую мы определили в классе TaskDemo, каждые 3 секунды. Класс TaskDemo выводит текущее время выполнения, чтобы мы могли видеть задержку выполнения.

    . 12 93 Найти 3 элемент Array 9 из Array0312 709 9712 Лексикографический ранг строки 90 1 3 3 123 60 3 9 3 .12 104 3 13 50310 30313 1 3 3 9031. 0313 .0313 Разделить строку 3 3 3 1532130310 0 3 1333120312 Sort Elements by Frequency II Номер. 0313 3 13 13 Башня Ханоя 13131313131313 131313 13 . Значение (Hashmap) 3 1803

    0 . 0313 1 3 30313 7 13390 3 133120312 Queue based approach for first non-repeating character in a stream Leet Solution 3 15833 0312 155 Проверить, является ли заданное дерево двоичным или нет0313 313 13 . 0313 0310 90313 3 3 363 13 0312 Определите, можно ли получить матрицу с помощью вращения. разрешено пространство 0303 .2 Ячейки с нечетными значениями кода LeetCode0313 20313 K Минимальное общее количество операций с изменением места впустую0313
    S.No Interview Question Number of times has been asked
    1 Delete a node in doubly linked list 2847
    2 Java program to find the number of Узлы в двоичном дереве 2515
    3 Перевернуть строку без изменения специальных символов 2483
    4 0313 2265
    5 УДАЛИТЬ Узел связанного списка в данной позиции 1990
    6 СОДЕРЖАНИЯ В СПИСОК В СПИСОК В СПИСОК В СПИСКОМ СПИСЕМ В СПИСКОВОЙ СОДЕЛЕНИЕ В СПИСКОНАМИ СОЗДАНИИ. 7 Найти элементы пары из массива, сумма которой равна номеру 1662
    8 Сортируемые элементы по частоте ног -нянь.0312 Quick Sort 1632
    10 Напишите программу для печати всех перестановки 1622
    11 Создайте вдваированный список 1458
    13 Реверс Array 1431
    14
    .0313 1407
    15 Recursively remove all adjacent duplicates 1372
    16 Find a Triplet That Sum to a Given Value 1367
    17 First Repeating Element 1356
    18 Упорядочить четные и нечетные числа так, чтобы нечетные шли после четных0312 1330
    20 Smallest Positive Number Missing in an Unsorted Array 1297
    21 Check if the Elements of an Array are Consecutive 1264
    22 Detect a loop in Связанный список 1249
    23 Непрерывный подмассив с наибольшей суммой 1235
    310312 1230
    25 Subarray с данной суммой 1225
    26 . Все возможные комбинации r Elements в данном сельском ассортименте . выполнить поиск подстроки 1213
    28 Найти максимальное повторяющееся число в массиве 1176
    29 vers0313 1134
    30 Find the First and Second Smallest Elements 1129
    31 Check if two linked lists are identical 1118
    32 Maximum Subarray Sum using Divide and Conquer 1115
    33 Удалить символы из первой строки, которые находятся во второй0313 1069
    35 Swap nodes in the linked list 1050
    36 Find the Number Occurring Odd Number of Times in an Array 1012
    37 Arrange given Numbers составить наибольшее число II 1004
    38 найти второй по частоте символ0313 984
    40 Find Triplet in Array With a Given Sum 973
    41 Total number of occurrences of a given item in the linked list 964
    42 Для данного отсортированного массива и числа x найдите пару в массиве, сумма которых ближе всего к x62
    44 Print all possible words from phone digits 945
    45 Find the Missing Number 936
    46 Rearrange Positive and Negative Numbers Alternatively in Array 928
    47 Самая длинная палиндромная подстрока 912
    48 Разделение четных и нечетных узлов в связанном списке 01
    49 Print Longest common subsequence 894
    50 Union and Intersection of Two Linked Lists 883
    51 Transform one string to another using minimum number заданных операций 883
    52 Проверить, может ли переставленная строка образовывать палиндром 864
    53 0313 855
    54 Iterative Implementation of Quick Sort 844
    55 Insertion Sort 835
    56 Count Possible Triangles 833
    57 Умножение двух матриц. Check if the linked list is palindrome 804
    60 Rotate a Linked List 803
    61 Stock Buy Sell to Maximize Profit 801
    62 Concatenation из двух строк 773
    63 Перетягивание каната 771
    64 Подсчет K символов с 9 различными подстроками0313 766
    65 Print all duplicates in the input string 765
    66 Find Nearest Greater and Smaller Element 758
    67 The Celebrity Problem 752
    68 Обратная строка без временной переменной 749
    69 Поиск пифагорейских троек из массива 336
    70 Удалите ‘B’ и ‘AC’ из данной строки 744
    71 Найти все общие элементы в трех отсортированных массиве 7369 . в несортированном связанном списке 719
    73 Найти строку с максимальным числом единиц 715
    74
    75 Find the subarray whose sum is equal to a given number X 708
    76 Remove Minimum Characters so that Two Strings Become Anagrams 704
    77 Найти наименьшее пропущенное число в отсортированном массиве0313 695
    80 Generate all Binary Strings Without Consecutive 1’s 692
    81 Implement Two Stacks in an Array 686
    82 Maximum Sum of Non Consecutive Elements 684
    83 Подмассив максимального произведения II 670
    84
    85 Check if Two given Matrices are Identical 659
    86 Multiplication of Previous and Next 657
    87 Subtraction of Two Matrices 648
    88 Объединить K отсортированные массивы и вывести отсортированный вывод 643
    89 Переместить все нули в конец заданного массива 642
    90 Divide a string in N equal parts 638
    91 Online Algorithm for Checking Palindrome in a Stream 638
    92 Form Minimum Number from Given Sequence of D’s and I’s 634
    93 Проверить, являются ли две строки анаграммами друг друга0313 625
    95 Sort a stack using a temporary stack 620
    96 Maximum Circular Subarray Sum 620
    97 Sort a linked list that is sorted alternating ascending и по убыванию 620
    98 Найти минимальный элемент в отсортированном и повернутом массиве 613
    Subarray и последующая 612
    100 102 Самый большой подмассив с одинаковым количеством нулей и единиц 605
    103 Сравнить две строки (связанные списки) 103
    Flattening a linked list 601
    105 Maximum Element in an Array which is Increasing and then Decreasing 601
    106 Palindrome Permutations of a String 598
    107 Элемент большинства 590
    108 Элементы появляются в массиве более N/K раз 590
    Palindromes in a given range 589
    110 Minimum insertions to form a shortest palindrome 589
    111 Run length encoding 589
    112 Print all permutations с повторением 586
    113 Проверка Pangram 585
    114 Минимальное количество символов, которое нужно добавить в строку Front Palindrome0313 576
    115 Most repeating character in a string 576
    116 Rotate string to get lexicographically minimum string 575
    117 Remove all duplicates in a sorted linked список 574
    118 Объединить связанный список в другой в альтернативных позициях0313 574
    120 Repeated Subsequence of Length Two or More 572
    121 Minimum number of Merge Operations to make an Array Palindrome 569
    122 Print all anagrams вместе в последовательности слов 563
    123 Переупорядочить массив в соответствии с заданными индексами 559
    124 3Sum Leetcode Solution 558
    125 Two Sum Leetcode Solution 558
    126 Pancake Sorting Problem 554
    127 Merge Overlapping Intervals II 549
    128 Клонировать связанный список со следующим и случайным указателем 546
    129 Размер подмассива с максимальной суммой 537
    130 Transpose of a Matrix 537
    131 Remove Extra Spaces from a String 536
    132 Removing Spaces from a String using stringstream 535
    133 Удалить дубликаты из строки 534
    134 Максимальная сумма возрастающих подпоследовательностей
    135 Smallest Palindrome after Replacement 533
    136 Check if a given string is a rotation of a palindrome 533
    137 Partition Problem 530
    138 Самый длинный палиндром может быть образован путем удаления или перестановки символов 529
    139 Генерация всех двоичных строк из заданного шаблона 518
    140 Check whether Strings are K Distance Apart or Not 516
    141 Length of Longest valid Substring 512
    142 Find Zeros to be Flipped so что число последовательных единиц максимально 511
    143 Удалить последнее вхождение 511
    144
    508
    145 Проверьте, являются ли две приведенные строки изоморфны для каждой остальной 506
    146 Максимум между двумя элементами. Программа для переключения всех символов в строке 501
    148 Данная строка представляет собой чередование двух других строк или нет 496
    149 Count Minimum Steps to Get the given Array 492
    150 Merge sort better than quick sort for linked lists 487
    151 Find Pair with Заданная разница 487
    152 Число меньших элементов справа 487
    153 Проверка числа, равного 153 , длина строки a равна 485
    154 Check if all Rows of a Matrix are Circular Rotations of Each Other 483
    155 Longest Common Prefix using Divide and Conquer 482
    156 Найти n-й узел связанного списка с конца. 0313 471
    159 Sort 0s 1s and 2s in an Array 471
    160 Find a Fixed Point in a Given Array 470
    161 Reverse words in a Приведенная строка 467
    162 Массив повторного заказа с использованием заданных индексов 466
    163 Медиана из двух сортированных ARRAY0310
    164 Найти субрай с данной длиной с наименьшим средним 464
    165 СРЕДЕЙ ДВА Сортированные СПИСОВЫЕ СПОСОБА. строки (рекурсия) 464
    167 Разделить связанный список с использованием альтернативных узлов0313 448
    169 Find Element Using Binary Search in Sorted Array 446
    170 Print all Palindromic Partitions of a String 443
    171 Swap Kth Node from beginning с K-м узлом от конца 443
    172 Найти подмассив длины K максимального среднего0313 434
    174 print all palindromic partitions 430
    175 Shortest Superstring Problem 429
    176 Maximum Length of Chain Pairs 426
    177 Сведение многоуровневого связанного списка 426
    178 Проверка, соответствует ли строка порядку символов по шаблону или нет 425
    179 Sorting a K Sorted Array 421
    180 Sort a String According to Another String 418
    181 Longest Span with same Sum in two Binary Arrays II 408
    182 Найдите отсортированную последующую подпоследовательность размера 3 406
    183 Обратный список. 0313
    184 Рекурсивно печатайте все предложения, которые можно сформировать из списка слов 403
    185 Программа добавить два бинарных цифр . Числа с нечетными вхождениями в несортированном массиве 399
    187 Самый длинный общий префикс с использованием двоичного поиска II 399
    0312 Reverse a Singly Linked List (Iterative/Non-Recursive) 396
    189 Kth Non-repeating Character 393
    190 Caesar Cipher 393
    191 Переупорядочить связанный список в Zig-Zag 390
    192 Проверить, может ли строка стать пустой путем рекурсивного удаления данной подстроки 389
    Pancake Sorting 385
    194 Longest Common Prefix Word by Word Matching 383
    195 Rotate Image by 90 degrees 382
    196 Permutations of a Given Строка с использованием STL 380
    197 Идеальная обратимая строка 378
    198 MERED
    198 MERED
    198 MEREDENG
    198 375
    199 Find First non-repeating character in a string 374
    200 Increasing Subsequence of Length three with Maximum Product 373
    201 Find the point где монотонно возрастающая функция становится положительной в первый раз0303 203 Sort a linked list with 0s, 1s and 2s 369
    204 List items containing all characters of a given word 367
    205 Four Elements that Sum to Given 367
    206 362
    208 Delete N nodes after M 361
    209 Count Number of Occurrences in a Sorted Array 358
    210 Palindrome string (number) 355
    211 Минимум символов, которые необходимо удалить, чтобы сделать двоичную строку альтернативной 354
    212
    213 Maximum occurring character in a string 351
    214 Sorting the array of strings 346
    215 Recursive Implementation of atoi() 344
    216 Проверить, образует ли связанный список строк палиндром 343
    217 Допустимые скобки0303 218 Even Substring Count 342
    219 Convert a String that is Repetition of a Substring of Length K 342
    220 Print All Distinct Elements of the Array 341
    221 Найти первое повторяющееся число в заданном массиве0313
    223 Print Shortest Path to Print a String on Screen 336
    224 Convert string1 to string2 in one edit 333
    225 Nth Character in Concatenated Decimal String 333
    226 Решение максимального подмассива Leetcode 332
    227 Можем ли мы обратить связанный список менее чем за O(n) времени? 331
    228 wildcard character matching 330
    229 Count the number of words 330
    230 Reverse a String using Stack 330
    231 Двоичное дерево в двусвязный список 329
    232 Нижний регистр в верхний регистр 327
    327
    234 Merge Two Sorted Arrays 322
    235 Find the Lost Element From a Duplicated Array 322
    236 Split Four Отдельные строки 319
    237 Найти середину связанного списка 318
    238 Программирование Dynamic Chain Multitrix 316
    239 Longest Common Subsequence with Permutations 315
    240 Count the Pairs at Same Distance as in English Alphabets 313
    241 Next Greater Element in an Массив 306
    242 Преобразование из римского в целое число Литкод Решение 303
    243 Перестановка 0312 300
    244 Find Nth Node 295
    245 Find All Pairs With a Given Difference 295
    246 Searching a node in a Binary Search Tree 293
    247 String(represents an integer) to value 290
    248 Delete a Tree 290
    249 Reverse a String 289
    250 Toeplitz Matrix 289
    251 Triplet from three linked lists with given sum 289
    252 Print all Possible Способы разорвать строку в форме скобок 288
    253 Поиск по слову Решение Leetcode 288
    254 Обратные биты 3 0313 285
    255 Sort an array of strings 285
    256 Delete a node under given conditions 284
    257 N queen problem 284
    258 Изменить пол данной строки 284
    259 Как эффективно реализовать k стеков в одном массиве? 283
    260 Count Pairs With Given Sum 283
    261 Binary Tree 282
    262 Number of sub-strings which recursively add up to 9 281
    263 Первый не повторяющийся элемент 279
    264 Повторяющаяся подстроение 279
    265 278
    266 Move all negative elements to one side of array 277
    267 Longest Common Extension 276
    268 Meeting Rooms II LeetCode Solution 276
    269 Минимальный стек 275
    270 Удаление средних точек в связанном списке отрезков 3174
    271 Remove spaces from a string 273
    272 Longest Palindromic Substring LeetCode Solution 273
    273 Shuffle a given Array 272
    274 Алгоритм Дейкстры 266
    275 Числа Фибоначчи 266
    276 0313 266
    277 Cuckoo sequence program 265
    278 Find, second, frequent, character 265
    279 House Robber Leetcode Solution 264
    280 Свести к минимуму максимальную разницу высот 264
    281 Макс. стопка 262
    Sudoku Solver 262
    283 Word Search 261
    284 KMP Algorithm 257
    285 Expression Evaluation 256
    286 Сортировка по абсолютным значениям 256
    287 Подмножество Leetcode 255
    288 Search Position Insert Search Solution 0313 255
    289 Number Of 1 bits 254
    290 Clone a linked list with next and random pointer (Hashing) 254
    291 Evaluation of Postfix Expression 253
    292 Обратные слова по строке 252
    293 плюс один раствор Leetcode 252 252 плюс один раствор Leetcode 252 252 252 плюс один раствор Leetcode 252 252 252 252 плюс один Leetcode Dolid0312 294 Valid Palindrome Leetcode Solution 252
    295 Combination Sum Leetcode Solution 252
    296 Min Stack Leetcode Solution 250
    297 Merge Отсортированные массивы Решение Leetcode 247
    298 Как удалить связанный список 246
    299 Backspace String Compare 246
    300 Subarray with 0 sum 245
    301 Rabin Karp Algorithm 243
    302 Set Matrix Zeroes 242
    303 Пара положительных и отрицательных значений в массиве 242
    304 Общие элементы во всех строках данной матрицы 242
    305 Reversing a Queue 240
    306 Sqrt(x) Leetcode Solution 239
    307 Delete middle element of a stack 237
    308 Пересечение двух массивов II Решение литкода 237
    309 Комбинация Сумма 237
    3120313 237
    311 Contains Duplicate II Leetcode Solution 237
    312 Pascal Triangle Leetcode 236
    313 Product of array except self 235
    314 Количество пар индексов с одинаковыми элементами в массиве 235
    315 Содержит повторяющиеся 234
    316 Reverse individual words 234
    317 Find Top K (or Most Frequent) Numbers in a Stream 233
    318 Integer to Roman Leetcode Solution 233
    319 Минимум перестановок, необходимых для объединения всех элементов, меньших или равных k0313
    321 Page Replacement Algorithms in Operating Systems 232
    322 String Compression 232
    323 Sliding Window Technique 230
    324 Count Odd Числа в интервальном диапазоне Решение Leetcode 230
    325 Подсчет подмассивов с одинаковым количеством единиц и нулей 230
    326 Single Number Leetcode Solution 229
    327 Implementation of Deque using Doubly Linked List 229
    328 Bellman Ford Algorithm 228
    329 Добавление двоичного решения Leetcode 228
    330 Построение двоичного дерева из заданных обходов в прямом и прямом порядке 228
    331 Postfix to Infix Conversion 226
    332 Minimum Value to Get Positive Step by Step Sum Leetcode Solution 226
    333 Second Most Repeated Word in a Sequence 226
    334 Сгруппировать слова с одинаковым набором символов0313
    336 Arithmetic Expression Evaluation 226
    337 Palindrome Linked List Leetcode Solution 225
    338 Find sum of non-repeating elements (distinct) elements in an array 225
    339 Next Permutation 225
    340 Kruskal Algorithm 225
    341 Maximum Number of Balloons Leetcode Solution 224
    342 Sum of minimum and maximum elements of all subarrays of size k 224
    343 Sort elements by frequency 224
    344 K-й наименьший элемент в отсортированной матрице0313 223
    346 Minimum operation to make all elements equal in array 222
    347 Given two unsorted arrays find all pairs whose sum is x 221
    348 Сортировочный массив с использованием стеков 221
    349 Решение для лечения мажорита 220
    350 Scramble String String String String String String String String String String String String String String String String String String String String String String String String String String String String String Strting String String String String String . 0313
    351 Longest Common Prefix Leetcode Solution 220
    352 Permutations Leetcode Solution 220
    353 Find Lucky Integer in an Array Leetcode Solution 220
    354 Алгоритм выпуклой оболочки 219
    355 Подсчет подмассивов, в которых общее количество различных элементов совпадает с исходным массивом 219
    356 Smallest Subarray with k Distinct Numbers 219
    357 Top K Frequent Words 219
    358 Longest Substring Without Repeating Characters LeetCode Solution 218
    359 Оценить подразделение 218
    360 Максимальный подмассив 217 3
    Third Maximum Number Leetcode Solution 217
    362 First element occurring k times in an array 216
    363 Prefix to Infix Conversion 216
    364 Special Число 216
    365 Поиск чисел с четным числом цифр Решение лит-кода 216
    366 366 0313 215
    367 Spiral Matrix LeetCode Solution 215
    368 Find the Town Judge Leetcode Solution 215
    369 Check if two arrays are equal or not 215
    370 Количество хороших пар Решение Leetcode 214
    371 Перестановка узлов в парах 9 2 3 903 11 Решение Leetcode
    372 Найти дубликаты в данном массиве, когда элементы не ограничены диапазоном 213
    373 . Реверсирование первых K элементов очереди0312 213
    377 Group Anagrams 212
    378 Maximal Square 211
    379 Missing Number Leetcode Solution 211
    380 Reverse a Number Использование стека 211
    381 Запрос сумм диапазона 2D – решение с неизменяемым литкодом 211
    382 30313 211
    383 Running Sum of 1d Array Leetcode Solution 210
    384 Count Primes Leetcode Solutions 210
    385 Minimum Absolute Difference Leetcode Solution 210
    386 Треугольник Паскаля II Решение литкода 209
    387 Top K Frequent Elements 209
    388 Single Number 209
    389 Sorting using trivial hash function 209
    390 Merge Two Sorted Lists Leetcode Solutions 209
    391 Максимальное расстояние между двумя вхождениями одного и того же элемента в массиве 208
    392 Найти все числа, исчезнувшие в массиве Решение Leetcode 208
    393 Palindrome Substring Queries 208
    394 Power of Two Leetcode Solution 208
    395 Find the Closest Palindrome number 208
    396 Сортировка массива по возрастанию частоты Решение литкода 208
    397 Совокупная частота подсчета каждого элемента в несортированном массиве 207
    398 Best Time to Buy and Sell Stock  II Leetcode Solution 207
    399 Convert String To Int 207
    400 Find Minimum In Rotated Sorted Array 207
    401 Проблема суммы подмножеств0312 206
    403 Matrix Diagonal Sum Leetcode Solution 206
    404 Unique Paths 206
    405 House Robber II Leetcode Solution 206
    406 Реализовать стек и очередь с помощью Deque 206
    407 Проверить, содержит ли массив непрерывные целые числа с разрешенными дубликатами 206
    408 Coin Change 2 Leetcode Solution 205
    409 Letter Case Permutation 205
    410 Subarray Sum Equals k 205
    411 Subarray Сумма равна K Решение LeetCode 205
    412 Перестановки Leetcode 205
    413 3 3 Двудольный граф0313 205
    414 Zigzag Conversion 205
    415 Maximum Depth of Binary Tree Leetcode Solution 205
    416 Search in Rotated Sorted Array Leetcode Solution 205
    417 Средняя заработная плата без учета минимальной и максимальной заработной платы Решение 205
    418 Найдите три первых повторения в массиве 205
    419 Expression Contains Redundant Bracket or Not 204
    420 Find Number of Employees Under every Employee 204
    421 Difference between highest and least frequencies in массив 204
    422 Как реализовать стек с использованием приоритетной очереди или кучи? 204
    423 Happy Number Leetcode Solution 204
    424 Find Winner on a Tic Tac Toe Game Leetcode Solution 204
    425 Unique Paths Leetcode Solution 204
    426 Max Последовательные решения Leetcode 203
    427 Найти медиану из потока данных0313 203
    429 Length of the largest subarray with contiguous elements 203
    430 Print All Distinct Elements of a Given Integer Array 203
    431 Smallest Element Repeated Exactly K Times 203
    432 Лучшее время для покупки и продажи Stock III Решение Leetcode 202
    433 Count Substrings with equal number of 0s, 1s and 2s 202
    434 How Many Numbers Are Smaller Than the Current Number Leetcode Solution 202
    435 Capacity To Ship Packages Within D Days Leetcode Solution 201
    436 LRU Cache Implementation 201
    437 Decode String 201
    438 Check If N and Its Double Exist Leetcode Solution 201
    439 Sort a stack using recursion 201
    440 Count pairs from two linked lists whose sum is equal to Обращенное значение 200
    441 Субары с различными элементами 200
    442
    442
    442
    442
    442 . 0313 200
    443 Nth Catalan Number 200
    444 Fizz Buzz 200
    445 Print all subarrays with 0 sum 200
    446 Find The Duplicate Number 199
    447 Reverse Vowels of a String Leetcode Solution 199
    448 Monotonic Array LeetCode Solution 199
    449 Remove Minimum Number of Elements Such That no Common Element Exist in both Array 199
    450 Fibonacci Number LeetCode Solution 199
    451 Reverse Integer 199
    452 Удалить дубликаты из отсортированного массива0313 198
    454 Найдите все пары (A, B) в массиве, что A % B = K 198
    455 Обратный А. Стек. 456 Сгенерировать строку со символами, которые имеют нечетное количество LeetCode Solution 197
    457 .0313 197
    459 Integer to English words 197
    460 Prim’s Algorithm 197
    461 Edit Distance 197
    462 Flood Fill LeetCode 196
    463 Сумма диапазонов подмассивов Leetcode Solution 196
    49 Обратное0312 196
    465 Text Justification LeetCode Solution 196
    466 Find Common Characters Leetcode Solution 196
    467 Count and Say 196
    468 Итеративная Ханойская башня 195
    469 Самый длинный подмассив, не содержащий более K различных элементов 195
    470 Delete a Node from linked list without head pointer 195
    471 Priority Queue Using Singly Linked List 195
    472 Reverse Words in a String III LeetCode Solution 195
    473 K-й по величине элемент в массиве Leetcode Solutions 195
    474 Обратный связанный список 3 905
    475 Merge Two Sorted Linked Lists 195
    476 MiniMax Algorithm 195
    477 The K Weakest Rows in a Matrix Leetcode Solution 195
    478 Найти отдельные элементы, общие для всех строк матрицы0312 480 Prefix to Postfix Conversion 194
    481 Find the Duplicate Element 194
    482 Sorting a Queue without Extra Space 194
    483 Find missing элементы диапазона 193
    484 Степень массива 193
    485 Итеративный неупорядоченный обход 193
    486 Shuffle the Array Leetcode Solution 193
    487 Word Ladder LeetCode Solution 193
    488 Target Sum 193
    489 Самый медленный ключ Решение Leetcode 193
    490 Номер столбца листа Excel Решение Leetcode 193
    491 Longest Common Subsequence 193
    492 Shuffle String Leetcode Solution 193
    493 Pair with given product 193
    494 Find any one из нескольких повторяющихся элементов в массиве только для чтения 192
    495 Сбалансированное решение литкода двоичного дерева 192
    496 Найти первую и последнюю позицию элемента в решении LeetCode
    497 Найти разницу LeetCode Solution 1 192
    499 Design Parking System Решение Leetcode 192
    500 Вид Binary Top 192
    501 Find Index of Closing Bracket for a Given Opening Bracket in an Expression 192
    502 Multiply Strings Leetcode Solution 192
    503 Valid Parenthesis String 192
    504 Подстрока с конкатенацией всех слов0313 191
    506 Postfix to Prefix Conversion 191
    507 Priority Queue in C++ 191
    508 Shortest Palindrome 191
    509 Объединение массивов LeetCode Solution 190
    510 Объединение перекрывающихся интервалов 190
    511 30313 190
    512 Number of Steps to Reduce a Number to Zero Leetcode Solution 190
    513 Next Greater Element I Leetcode Solution 190
    514 Check if a заданный массив содержит повторяющиеся элементы на расстоянии k друг от друга0313 190
    517 The Stock Span Problem 189
    518 Check for Balanced Parentheses in an Expression 189
    519 Implement Stack using Queues 189
    520 Максимальная площадь острова 189
    521 K-й наибольший элемент в потоке0303 522 Jump Game Leetcode Solution 189
    523 Kids With the Greatest Number of Candies Leetcode Solution 189
    524 Minimum Moves to Equal Array Elements Leetcode Solution 189
    525 Зигзагообразное преобразование Решение LeetCode 189
    526 K-й отдельный элемент в массиве 189
    527 Longest Common Prefix using Sorting 188
    528 Move Zeroes LeetCode Solution 188
    529 Intersection of Two Arrays 188
    530 Преобразование двоичной строки в виде чередующихся вхождений x и y 188
    531 Следующий элемент с большей частотой 188
    532 Count number of triplets with product equal to given number 188
    533 Convert array into Zig-Zag fashion 188
    534 Shuffle an Array 187
    535 Найдите N уникальных целых чисел, равных нулю0312 537 Largest Sum Contiguous Subarray 187
    538 Smallest Subarray With all Occurrences of a Most Frequent Element 186
    539 Minimum Bracket Reversals 186
    540 Удалить узел в связанном списке0303 542 Mobile Numeric Keypad Problem 186
    543 Excel Sheet Column Title Leetcode Solution 186
    544 Arrange given numbers to form the biggest number 186
    545 Пиковый индекс в горном массиве 186
    546 Преобразование обычного BST в сбалансированное BST 186
    547 Last Stone Weight 185
    548 Is Subsequence Leetcode Solution 185
    549 Contiguous Array Leetcode 185
    550 Sum of Left Leaves Leetcode Solutions 185
    551 Длина последнего слова Leetcode Solution 185
    552 Раздайте конфеты Leetcode Solution 185
    553 Change the Array into Permutation of Numbers From 1 to N 184
    554 Largest Perimeter Triangle Leetcode Solution 184
    555 Gold Mine Problem 184
    556 Изоморфные строки Решение LeetCode 184
    557 Решение LeetCode 184
    558 Linked List Cycle II LeetCode Solution 184
    559 Hamming Distance 184
    560 Group Multiple Occurrence of Array Elements Ordered by first Occurrence 184
    561 Минимум операций удаления, чтобы сделать все элементы массива одинаковыми 184
    562 0313 184
    563 Find Sum of all unique sub-array sum for a given array 183
    564 Koko Eating Bananas Leetcode Solution 183
    565 How to проверить, не пересекаются ли два заданных множества? 183
    566 Подсчет количества узлов на заданном уровне в дереве с использованием BFS0313 183
    568 Maximum path sum in a triangle 182
    569 Combinations Leetcode Solution 182
    570 Island Perimeter Leetcode Solution 182
    571 Целое число в латинское 182
    572 Первое отрицательное целое число в каждом окне размера k 182
    573 Implementation of Deque using circular array 182
    574 Summary Ranges Leetcode Solution 182
    575 Find Words That Can Be Formed by Characters Leetcode Solution 182
    576 Построить массив из перестановки Решение Leetcode 182
    577 Назначить Cookies Решение Leetcode 181
    578 3Sum Closest LeetCode Solution 181
    579 The Knapsack Problem 181
    580 Jewels and Stones Leetcode Solution 181
    581 Relative Сортировать Массив Лит-код Решение 181
    582 Количество провинций Лит-код Решение 181
    583 N-th Tribonacci Number Leetcode Solution 181
    584 Maximum difference between first and last indexes of an element in array 181
    585 Maximum sum rectangle in a 2D matrix 180
    586 LRU Cache LeetCode Solution 180
    587 Минимальное количество подмножеств с отдельными элементами
    588 Find if an Expression has Duplicate Parenthesis or Not 180
    589 Shortest Path in a Grid with Obstacles Elimination LeetCode Solution 180
    590 Decode Ways 180
    591 01 Matrix LeetCode Solution 180
    592 Минимум операций для преобразования 180
    593 Maximum Distance in Array 180
    594 Sieve of Eratosthenes 179
    595 Convert Sorted Array to Binary Search Tree Leetcode Solution 179
    596 Удалить элементы связанного списка0313 179
    598 Longest Increasing Subsequence 178
    599 Trapping Rain Water LeetCode Solution 178
    600 Rotate Image LeetCode Solution 178
    601 Найдите наименьшее целое положительное значение, которое не может быть представлено в виде суммы любого подмножества заданного массива 178
    602 Bubble sort using two Stacks 178
    603 Maximum Number of Occurrences of a Substring Leetcode Solution 178
    604 Distance Between Bus Stops Leetcode Solution 178
    605 Уникальные двоичные деревья поиска 178
    606 Удаление всех вхождений подстроки Решение LeetCode 177
    607 Sort Characters By Frequency LeetCode Solution 177
    608 Rotate List Leetcode Solution 177
    609 Insert Interval Leetcode Solution 177
    610 Find минимальная разница между любыми двумя элементами 177
    611 Same Tree LeetCode Solution 177
    612 Минимальная стоимость найма K работников 176
    613 Наименьшая хорошая база 176
    176
    614 9033 176
    615 Word Pattern 176
    616 XOR Operation in an Array Leetcode Solution 176
    617 Minimum insertions to form a palindrome with permutations allowed 176
    618 Check if a queue can be sorted into another queue using a stack 176
    619 Iterative Method to find Height of Binary Tree 176
    620 Обратный стек без использования дополнительного пространства в O (n) 176
    621 Непересекающая сумма с двумя наборами 175
    6212
    6212 175
    623 Maximum Number of Chocolates to be Distributed Equally Among k Students 175
    624 Frog Jump Leetcode Solution 175
    625 Check If It Is a Решение Leetcode для прямой линии 175
    626 Форматирование лицензионного ключа Решение Leetcode 175
    627 Максимальный текущий элемент стека 0313 174
    628 Printing brackets in Matrix Chain Multiplication Problem 174
    629 Isomorphic Strings 174
    630 Delete consecutive same words in a sequence 174
    631 Лучшее время для покупки и продажи акций Решение LeetCode 174
    632 НОД двух чисел 174
    633 Stone Game LeetCode 174
    634 Permutation in String Leetcode Solution 174
    635 Painting Fence Algorithm 174
    636 Сортировка массива по четности Решение LeetCode 174
    637 Определение IP-адреса Решение Leetcode 173
    638 Maximum Consecutive Numbers Present in an Array 173
    639 Reorganize String 173
    640 Minimum Number of Steps to Make Two Strings Anagram Leetcode Solutions 173
    641 K Пустые слоты LeetCode 173
    642 Заменить элементы наибольшим элементом справа. Решение Leetcode 173
    643 Find the Duplicate Number LeetCode Solution 173
    644 Applications of Breadth First Search and Depth First Search 173
    645 Word Wrap Problem 173
    646 Проблема с раздачей монет 173
    647 Уменьшение тарелок Решение LeetCode
    30310
    648 Form minimum number from given sequence 172
    649 Optimal Account Balancing LeetCode Solution 172
    650 Partition Labels LeetCode Solution 172
    651 Расстояние до ближайшей ячейки с 1 в двоичной матрице 172
    652 Сумма f(a[i], a[j]) по всем парам в массиве из n целых чисел 172
    653 House Robber 172
    654 Find Maximum Level sum in Binary Tree 172
    655 Find Largest d in Array such that a + b + c = D 172
    656 Слияние Два сбалансированных бинарных поисковых деревье0313
    658 Wiggle Sort 171
    659 Convert an array to reduced form 171
    660 Longest Substring with At Least K Repeating Characters LeetCode Solution 171
    661 Найти значение расстояния между двумя массивами0313 171
    663 Strobogrammatic Number LeetCode Solution 171
    664 Best Time to Buy and Sell Stock with Cooldown Leetcode Solution 171
    665 Segregate 0s and 1s in Массив 171
    666 Переворот изображения0312 170
    668 Find pairs with given sum such that elements of pair are in different rows 170
    669 Valid Perfect Square Leetcode Solution 170
    670 Kth Missing Положительное число Решение LeetCode 170
    671 Двоичное дерево Зигзагообразный порядок обхода порядка Решение LeetCode 170
    672 K Empty Slots 170
    673 Employee Free Time LeetCode Solution 170
    674 Moving Average from Data Stream Leetcode Solution 170
    675 Valid Palindrome II Решение LeetCode 170
    676 Самый длинный возрастающий путь в матрице Решение LeetCode 169
    677 Letter Combinations of a Phone Number 169
    678 Valid Palindrome 169
    679 Path With Maximum Minimum Value LeetCode Solution 169
    680 Sum of All Odd Длина Подмассивы Leetcode Solution 169
    681 В порядке следования узла в двоичном дереве 169
    682 Longest Substring with At Most K Distinct Characters LeetCode Solution 169
    683 Count Good Nodes in Binary Tree Leetcode Solution 168
    684 Number of Dice Rolls With Target Sum LeetCode Solution 168
    685 Первый уникальный символ в строке Решение LeetCode 168
    686 В нижний регистр Решение Leetcode 168
    687 Check If Two String Arrays are Equivalent Leetcode Solution 168
    688 Recover Binary Search Tree 168
    689 Find Leaves of Binary Tree LeetCode Solution 168
    690 Удалить N-й узел с конца данного связанного списка 168
    691 Find Pair with Greatest Product in Array 168
    692 Rearrange an array in order – smallest, largest, 2nd smallest, 2nd largest 168
    693 Find the node with minimum value in a Binary Search Tree 168
    694 Unique Paths II Leetcode Solution 168
    695 Subset Sum Leetcode 167
    696 Find the Smallest Divisor given a Threshold Leetcode Solution 167
    697 Edit Distance LeetCode Solution 167
    698 Longest Span with same Sum in two Binary arrays 167
    699 Разбиение массива на три части с решением равной суммы Leetcode0313 167
    701 Reverse Only Letters LeetCode Solution 167
    702 Maximum Product of Two Elements in an Array Leetcode Solution 167
    703 Sort Array by Increasing Frequency Решение Leetcode 167
    704 Факториал в конце нулей Решение Leetcode 166
    705 Решение Leetcode Majority Elementity0313 166
    706 Print the Fibonacci numbers in reverse order 166
    707 Lucky Numbers in a Matrix Leetcode Solution 166
    708 Largest subarray with equal number of 0s и 1s 166
    709 Преобразование числа в шестнадцатеричный литкод Решение 166
    Решение Неверный код 9 Удалить 710
    166
    711 Increasing Decreasing String Leetcode Solution 166
    712 Find the largest multiple of 3 166
    713 String Compression LeetCode Solution 166
    714 Основы динамического программирования 166
    715 Реверсирование очереди с использованием рекурсии 166
    716 Robot Room Cleaner Leetcode Solution 166
    717 Permutation Sequence LeetCode Solution 166
    718 Bulb Switcher LeetCode Solution 165
    719 Non -убывающее Array LeetCode Solution 165
    720 Stack Permutations (Проверить, является ли массив перестановкой стека другого) 165
    721 Numbers with prime frequencies greater than or equal to k 165
    722 Maximum Number of Coins You Can Get Leetcode Solution 165
    723 Populating Next Правые указатели в каждом узле 165
    724 Двоичное дерево Zigzag Уровень. 0313 165
    726 Power of Four Leetcode Solution 165
    727 Generate all possible sorted arrays from alternate elements of two given sorted arrays 165
    728 String to Целое число (atoi) LeetCode Solution 165
    729 Добавить и найти слово – Дизайн структуры данных LeetCode 165
    730 Find whether an array is subset of another array 165
    731 Find unique character in a string 165
    732 Ugly Number Leetcode Solution 165
    733 k-й недостающий элемент в возрастающей последовательности, которого нет в данной последовательности 164
    734 Подсчитать четверки из четырех отсортированных массивов, сумма которых равна заданному значению x 164
    735 Minimum Distance Between BST Nodes Leetcode Solution 164
    736 Rank Transform of an Array Leetcode Solution 164
    737 Merge Two Binary Деревья Решение LeetCode 164
    738 Выполнение сдвигов строк Leetcode 164
    739 Mor Traversal0313 164
    740 Construct BST from given Preorder Traversal 164
    741 Snakes and Ladders LeetCode Solution 164
    742 Restore IP Addresses Leetcode Solution 164
    743 Растущий стек на основе массива 163
    744 Двоичное дерево Максимальная сумма путей Решение LeetCode 163
    745 Check if Two Expressions With Brackets are Same 163
    746 Minimum Cost For Tickets Leetcode Solution 163
    747 Maximum Product of Three Numbers LeetCode Solution 163
    748 Решение LeetCode для гоночных автомобилей 163
    749 Соответствие регулярным выражениям1

    2 162
    750 Evaluate Reverse Polish Notation LeetCode Solution 162
    751 Student Attendance Record I Leetcode Solution 162
    752 Word Pattern LeetCode Solution 162
    753 Удаление скобок из алгебраической строки, содержащей операторы + и – 162
    754 Диагональный обход бинарного дерева 162
    755 Largest Rectangle in Histogram LeetCode Solution 162
    756 Hamming Distance Leetcode Solution 162
    757 Binomial Coefficient 162
    758 Количество NGE справа 162
    759 Задача тайлинга 162
    760 Finding K closest element 162
    761 Keyboard Row Leetcode Solution 162
    762 Jump Game 161
    763 Valid Number 161
    764 Найти медиану из потока данных Решение LeetCode 161
    765 Максимальная прибыль при планировании заданий Решение Leetcode 161
    766 Печать двоичного дерева в вертикальном порядке 161
    767 Элементы, чтобы быть добавленными, так что все элементы Элементы были добавлены, так что все элементы . Максимум 69 чисел. Решение LeetCode 161
    769 Кодированный декомпресс-длина.0313 161
    771 Minimum time required to rot all oranges 160
    772 Kth ancestor of a node in binary tree 160
    773 Top K Frequent Words LeetCode Решение 160
    774 Merge K Сортированные списки связанных списков 160
    Linked List List List.0312 776 Maximum Depth of N-ary Tree Leetcode Solution 160
    777 Minimum Height Trees 160
    778 Merge Sorted Array LeetCode Solution 160
    779 Отсортированный связанный список для сбалансированного BST 160
    780 Суммарный вес вложенного списка II Решение LeetCode 160
    160
    782 Deletion in a Binary Tree 160
    783 Best Meeting Point LeetCode Solution 160
    784 Подсчет элементов, общих для обоих списков, но с разными ценами0313 160
    786 Minimize Maximum Pair Sum in Array LeetCode Solution 160
    787 Check for Palindrome after every character replacement Query 159
    788 Program for Bridge and Проблема с факелом 159
    789 N-Queens LeetCode Solution 159
    790
    Find if0313 159
    791 Partition to K Equal Sum Subsets Leetcode Solution 159
    792 Base 7 Leetcode Solution 159
    793 Check If Array Pairs Are Divisible by k LeetCode Solution 159
    794 Поиск в двоичном дереве поиска Leetcode Solution 159
    7
    159
    796 Special Array With X Elements Greater Than or Equal X Leetcode Solution 159
    797 Maximum Nesting Depth of the Parentheses Leetcode Solution 159
    798 Решение литкода симметричного дерева 159
    799 Всего чисел без повторяющихся цифр в диапазоне 159
    800 String comparison containing wildcards 159
    801 Longest Subarray Having Count of 1s One More than Count of 0s 159
    802 Sort an array according to the order defined by another array 158
    803 Разделить строку на сбалансированные строки Решение Leetcode 158
    804 Дополнение числа 9 Решение Leetcode0313 158
    805 Form Minimum Number From Given Sequence 158
    806 Number of Islands II LeetCode Solution 158
    807 Crawler Log Folder Leetcode Solution 158
    808 Транспонирование графика 158
    809 Найти все дубликаты в массиве Решение LeetCode
    810 Largest rectangular sub-matrix whose sum is 0 158
    811 Check if an Array is Stack Sortable 157
    812 Balanced Expression with Replacement 157
    813 Circular Queue 157
    814 Binary Search Tree Search and Insertion 157
    815 A Space Optimized DP solution for 0-1 Knapsack Problem 157
    816 Final Prices With a Special Discount in a Shop Leetcode Solution 157
    817 Minimum sum of multiplications of n Числа 157
    818 Курс. 0313
    820 One Edit Distance LeetCode Solution 157
    821 Brick Wall LeetCode Solution 157
    822 Nearest Exit from Entrance in Maze LeetCode Solution 157
    823 Минимальное время посещения всех точек Решение по литкоду 157
    824 Поиск решения 2D Matrix II по литкоду 157
    825 Partition List Leetcode Solution 157
    826 Remove Nth Node From End of List Leetcode Solution 157
    827 Last Stone Weight II LeetCode Solution 157
    828 Максимальная разница между возрастающими элементами Решение LeetCode 157
    829 Приоритетная очередь с использованием двусвязного списка 157
    830 Subarray Product Less Than K LeetCode Solution 157
    831 Identify and Mark Unmatched Parenthesis in an Expression 156
    832 Interval Tree 156
    833 Изменить порядок данных в лог-файлах0313 156
    835 Permutation Coefficient 156
    836 Remove Duplicates from Sorted List LeetCode Solution 156
    837 LCS (Longest Common Subsequence) of three strings 156
    838 Сортировка массива по четности II Решение LeetCode 156
    839 Минимум переходов для достижения дома Решение LeetCode 156
    840 Best Time to Buy and Sell Stock with Transaction Fee Leetcode Solution 155
    841 Sort Colors 155
    842 Clone Graph LeetCode Solution 155
    843 Допустимые скобки Решение LeetCode 155
    844 Повторяющийся шаблон подстроки Решение LeetCode
    845 Can Place Flowers LeetCode Solution 155
    846 Minimum swaps to make sequences increasing 155
    847 Matrix Chain Multiplication 155
    848 Дан массив пар Найдите в нем все симметричные пары 155
    849 Alien Dictionary LeetCode Solution 155
    850 Find the subarray with least average 155
    851 Find Maximum Sum Possible Equal Sum of Three Stacks 155
    852 Brightest Position on Street LeetCode Solution 154
    853 Получить максимум в сгенерированном массиве Решение Leetcode0313 154
    855 Relative Ranks Leetcode Solution 154
    856 Maximum size subarray sum equals k 154
    857 Minimum Sum Path in a Triangle 154
    858 Подсчет способов достижения n-й ступеньки с использованием шага 1, 2 или 3 154
    859 Запросы суммирования диапазона без обновлений 5431
    860 Convert BST to Min Heap 154
    861 Sorted Array to Balanced BST 154
    862 A program to check if a binary tree is BST or not 154
    863 Минимальное количество переходов для достижения конца0312 153
    865 Design a Stack With Increment Operation Leetcode Solution 153
    866 Missing Element in Sorted Array LeetCode Solution 153
    867 Minimum Swaps to Make Strings Equal Решение Leetcode 153
    868 Вставить Удалить GetRandom 153
    869
    153
    870 Path with maximum average value 153
    871 Design Browser History LeetCode Solution 153
    872 Number of Days Between Two Dates LeetCode Solution 153
    873 Подсчет различных элементов в каждом окне размера K0313 153
    875 Find all triplets with zero sum 153
    876 Check if a given array can represent Preorder Traversal of Binary Search Tree 153
    877 Friends Проблема сопряжения 153
    878 Обход дерева (предварительный, по порядку и после) 153
    9 Общие символы Решение Leetcode 9 Общие символы 3 30313 152
    880 Union and Intersection of two Linked Lists 152
    881 Check if stack elements are pairwise consecutive 152
    882 Diagonal Traverse LeetCode Solution 152
    883 Подмножество с суммой, кратной m 152
    884
    152
    885 Level order Traversal in Spiral Form 152
    886 Sum of nearest smaller and greater number 152
    887 Guess Number Higher or Lower LeetCode Solution Между 152
    888 Подсчет отрицательных чисел в сортированной матрице0313 152
    890 Guess Number Higher or Lower II 151
    891 Daily Temperatures Leetcode Solution 151
    892 Find distance between two nodes of a Binary Tree 151
    893 Найти все переставленные строки заданной строки в матрице0313 151
    895 Iterative Postorder Traversal Using Two Stacks 151
    896 Insert into a Binary Search Tree Leetcode Solution 151
    897 GCDs of given index ranges in массив 151
    898 Хранение ключей и значений на основе времени0313 151
    900 Range LCM Queries 151
    901 Sequences of given length where every element is more than or equal to twice of previous 151
    902 Water Бутылки Решение Leetcode 151
    903 Робот, ограниченный кругом Решение LeetCode 151
    904
    151
    905 Delete And Earn 151
    906 An Interesting Method to generate Binary Numbers from 1 to n 151
    907 Maximum Score After Splitting a String Leetcode Solution 150
    908 Переупорядочить массив таким образом, чтобы arr[i] равнялся i0313 150
    910 Construct Complete Binary Tree from its Linked List Representation 150
    911 Three way partitioning of an array around a given range 150
    912 K 150
    913 Количество отдельных островов Решение лит-кода 150
    914 Dividing Array into Pairs With Sum Divisible by K 150
    915 Queue using Stacks 150
    916 Alien Dictionary 150
    917 Проверьте, может ли данный массив представлять обход по порядку уровней двоичного дерева поиска 150
    918 Наименьшее количество уникальных целых чисел после K удалений Решение Leetcode 150
    919 BFS for Disconnected Graph 150
    920 3 Sum 149
    921 Averages of Levels in Binary Tree 149
    922 Преобразование отсортированного списка в двоичное дерево поиска нечетно и j < i 149
    924 All Unique Triplets that Sum up to a Given Value 149
    925 Queries for GCD of all numbers of an array except elements in a given range 149
    926 149
    929 Rearrange Spaces Between Words Leetcode Solution 149
    930 Analyze User Website Visit Pattern LeetCode Solution 149
    931 Destination City Leetcode Solution 149
    932 Установить матричные нули Решение литкода 149
    933 Решение 9 Кратчайшее слово0313 149
    934 Pattern Occurrences using Stack 149
    935 Count Subarrays with Same Even and Odd Elements 148
    936 Special Positions in a Binary Matrix Leetcode Solution 148
    937 Количество эквивалентных домино-пар Решение Leetcode 148
    938 Изменить решение Leet Leetcode0313 148
    939 Vertical sum in a given binary tree 148
    940 Sliding Window Maximum 148
    941 Spiral Matrix III LeetCode Solution 148
    942 Мой календарь I Решение LeetCode 148
    943 Максимальная сумма подмассива без учета определенных элементов 147
    944 Palindrome Partitioning Leetcode Solution 147
    945 Maximum Frequency Stack Leetcode Solution 147
    946 Remove Duplicates from Sorted List II LeetCode Solution 147
    947 Деревья минимальной высоты Решение LeetCode 147
    948 Двоичное дерево Самая длинная последовательная последовательность Решение LeetCode 147
    949 Largest area rectangular sub-matrix with equal number of 1’s and 0’s 147
    950 Product of Array Except Self LeetCode Solution 147
    951 Проверить, не перекрываются ли любые два интервала среди заданного набора интервалов 147
    952 Двоичный массив после M операций переключения диапазона 147
    953 Count Submatrices With All Ones LeetCode Solution 147
    954 Minesweeper LeetCode Solution 147
    955 Maximize Sum of Array after K Negations Leetcode Solution 147
    956 4Sum 147
    957 Сильносвязный компонент 147
    Count subarrays where second highest lie before highest 146
    959 Construct BST from its given Level Order Traversal 146
    960 Print Fibonacci sequence using 2 variables 146
    961 Подъем по лестнице 146
    962 Три последовательных коэффициента Решение Leetcode 146
    Reverse Nodes in K-Group 146
    964 Combination Sum IV LeetCode Solution 146
    965 Create Maximum Number 146
    966 Longest Palindromic Subsequence 146
    967 Поиск в глубину (DFS) для графика0313 145
    969 Count Primes in Ranges 145
    970 Intersection of Two Linked Lists LeetCode Solution 145
    971 Unique Paths II 145
    972 Разделение массива на последовательные подпоследовательности 145
    973 Объединение интервалов 145
    Разностный массив | Range update query in O(1) 145
    975 Stone Game II Leetcode 145
    976 Design Hit Counter LeetCode Solution 144
    977 Can Make Arithmetic Прогрессия от последовательности Leetcode Solution 144
    978 Разделение палиндрома 144
    979 Merge Sort 144
    980 Valid Boomerang Leetcode Solution 144
    981 Word Break 144
    982 Symmetric Tree 144
    983 K-й наименьший элемент в решении литкода BST 144
    984 Операция удаления двоичного дерева поиска 144
    985 Find Maximum of Minimum for Every Window Size in a Given Array 144
    986 Maximum Product Subarray 144
    987 Boundary Traversal of binary tree 143
    988 Перетасовать 2n целых чисел как a1-b1-a2-b2-a3-b3-. .bn без использования дополнительного пробела0313 143
    990 Find the Difference Leetcode Solution 143
    991 Largest divisible pairs subset 143
    992 Breadth First Search (BFS) for a Graph 143
    993 Длина наибольшей подпоследовательности Фибоначчи0313
    995 Sign of the Product of an Array LeetCode Solution 143
    996 Largest Substring Between Two Equal Characters Leetcode Solution 143
    997 Number Of Longest Increasing Subsequence 143
    998 Подсчет пар с заданной суммой 143
    999 Подпоследовательность максимальной длины с разностью между соседними элементами 0 или 1 либо 9 , либо 10313 142
    1000 The Maze III LeetCode Solution 142
    1001 Newman-Conway Sequence 142
    1002 Find postorder traversal of BST from preorder traversal 142
    1003 Граф Допустимое решение LeetCode дерева 142
    1004 Самая длинная подпоследовательность, для которой разница между соседними элементами равна единице 142
    1005 Maximum Length of Repeated Subarray 142
    1006 Asteroid Collision LeetCode Solution 142
    1007 Segment Tree 142
    1008 Найти такое количество пар в массиве, что их XOR равно 0 142
    1009 Задача о разделе художника 142
    1010 Найдите первый круговой тур, который посещает все бензиновые насосы 142
    1011 Высота генерального дерева . Двоичное дерево 142
    1013 Вставка в двоичном дереве 142
    1014 Проверка, если нанесение слов.0313 142
    1015 Largest Number Leetcode Solution 141
    1016 Rearrange array such that even positioned are greater than odd 141
    1017 Validate Binary Search Tree 141
    1018 Решение Scramble String LeetCode 141
    1019 Поиск повторяющихся поддеревьев 3 1 4031230313
    1020 First missing positive 141
    1021 Maximum subsequence sum such that no three are consecutive 141
    1022 String Matching in an Array Leetcode Solution 141
    1023 Построение самой длинной возрастающей подпоследовательности (N log N)0313 141
    1025 Compute nCr % p 140
    1026 Minimum Index Sum of Two Lists 140
    1027 Construct Binary Tree from given Parent Array representation 140
    1029 Максимальное произведение индексов следующего большего слева и справа 140
    0313 140
    1030 Level order traversal using two Queues 140
    1031 Decrypt String from Alphabet to Integer Mapping Leetcode Solution 140
    1032 Kill Process Решение LeetCode. 0312 Friends Of Appropriate Ages LeetCode Solution 140
    1035 Number of palindromic paths in a matrix 140
    1036 Shortest Completing Word Leetcode Solution 140
    1037 Build Массив со стеком.0310
    1039 Advantages of BST over Hash Table 140
    1040 Regular Expression Matching Regular Expression Matching LeetCode Solution 139
    1041 Balanced Binary Tree 139
    1042 K-й наименьший элемент в отсортированной матрице Решение LeetCode 139
    1043 Следующий больший элемент III Решение LeetCode 139
    1044 Make The String Great Leetcode Solution 139
    1045 Print Next Greater Number of Q queries 139
    1046 K maximum sums of overlapping contiguous sub -массивы 139
    1047 Двоичное дерево поиска 139
    1048 Максимальная сумма подлучей 139
    1049 Find a Peak Element II LeetCode Solution 139
    1050 Maximum weight transformation of a given string 139
    1051 Count pairs from two sorted arrays сумма которых равна заданному значению x 139
    1052 Максимальное количество способов разбиения массива Решение LeetCode 139
    1053 Minimum Size Subarray Sum 138
    1054 Morris Inorder Traversal 138
    1055 Rearrange an array such that ‘arr[j]’ becomes ‘i’ if ‘arr [I] ‘IS’ J ‘ 138
    1056 Доступные захваты для Rook LeetCode Solution 138
    1057
    1057
    1057 PAGT0303 1058 Lowest Common Ancestor 138
    1059 Double the first element and move zero to end 138
    1060 Ugly Numbers 138
    1061 Invalid Транзакции Решение LeetCode 138
    1062 Побитовое И диапазона чисел Решение LeetCode 137
    1063
    137
    1066 Уродливое число II Решение LeetCode 137
    Решение Arplicaort 1067 Удалить из LeetCode DuetCode 0313 137
    1068 Add two numbers 137
    1069 Find whether a subarray is in form of a mountain or not 137
    1070 Custom Sort String Leetcode Solution 137
    1071 Важность сотрудников Решение LeetCode 137
    1072 Количество братьев и сестер0313 137
    1073 Super Ugly Number 137
    1074 Path Sum II LeetCode Solution 137
    1075 Maximum difference between frequency of two elements such that element having greater частота также больше 137
    1076 Защита IP-адреса LeetCode Solution 136
    1077 Generate Parentheses Leetcode Solution 136
    1078 Populating Next Right Pointers in Each Node Leetcode Solution 136
    1079 Consecutive Characters LeetCode Solution 136
    1080 Решение Leetcode следующей перестановки 136
    1081 Действительное решение Tic-Tac-Toe State LeetCode 136
    1082 Implement Trie (Prefix Tree) Leetcode Solution 136
    1083 Recover Binary Search Tree Leetcode Solution 136
    1084 Path Sum 136
    1085 Типы бинарного дерева 136
    1086 Удаление палиндромных подпоследовательностей Решение Leetcode 136
    1087 Find the minimum distance between two numbers 135
    1088 Kth Smallest Product of Two Sorted Arrays LeetCode Solution 135
    1089 Binary Tree Right Side View LeetCode Solution 135
    1090 Увеличить расстояние до ближайшего человека0313 135
    1092 Search in Sorted Rotated Array 135
    1093 Rearrange array such that even index elements are smaller and odd index elements are greater 135
    1094 Преобразование BST в Min-Heap без использования массива0313 134
    1097 Queries for Number of Distinct Elements in a Subarray 134
    1098 Serialize and Deserialize Binary Tree LeetCode Solution 134
    1099 Longest Increasing Consecutive Subsequence 134
    1100 Вывести все триплеты в отсортированном массиве, образующие AP 134
    1101 Longest Bitonic Subsequence 134
    1102 Number of Closed Islands Leetcode Solution 134
    1103 Day of the Year Leetcode Solution 134
    1104 Increasing Triplet Subsequence LeetCode Решение 134
    1105 Самое большое поддерево BST LeetCode Решение 134
    1106 Cutting a Rod 133
    1107 Level of Each node in a Tree from source node 133
    1108 Find Smallest Range Containing Elements from k Lists 133
    1109 Перестановка палиндрома Решение LeetCode 133
    1110 Найти максимальную разницу между ближайшими левыми и правыми меньшими элементами 133
    1111 Smallest Common Region Leetcode Solution 133
    1112 Root to Leaf path with target sum Leetcode Solutions 133
    1113 Print Right View of a Binary Tree 133
    1114 Решение литкода третьего максимального числа 133
    1115 Структура данных двоичного дерева 333
    1116 Construct Binary Tree from Preorder and Postorder Traversal LeetCode Solution 133
    1117 Count Largest Group Leetcode Solution 133
    1118 Subarrays with K Different Integers Leetcode Solution 133
    1119 Количество учащихся, выполняющих домашнее задание в заданное время Решение Leetcode 133
    1120 Удалить дубликаты из отсортированного массива 132
    1121 Взгляд дна 132
    132
    132
    132
    1124 Итеративный метод поиска предков заданного бинарного дерева0313 132
    1125 Products of ranges in an array 132
    1126 Write Code to Determine if Two Trees are Identical 132
    1127 Distinct Subsequences 132
    1128 Сумма четных чисел после запросов0313 131
    1130 Thousand Separator Leetcode Solution 131
    1131 Constant time range add operation on an array 131
    1132 Minimum Absolute Difference in BST Leetcode Solution 131
    1133 Решение простого палиндрома LeetCode 131
    1134
    131
    1135 Maximum Product Subarray 130
    1136 Search Insert Position 130
    1137 Topological Sorting 130
    1138 Minimum Score Триангуляция многоугольника Leetcode Solution 130
    1139 Вывести измененный массив после выполнения команд сложения и вычитания 130
    1140 Longest Subarray of 1’s After Deleting One Element LeetCode Solution 130
    1141 Construct K Palindrome Strings LeetCode Solution 130
    1142 Palindromic Substrings Leetcode Solution 130
    1143 Среднее значение массива после удаления некоторых элементов Решение литкода 130
    1144 Delete Nodes and Return Forest Leetcode Solution 129
    1145 Moser-de Bruijn Sequence 129
    1146 Golomb sequence 129
    1147 Find maximum length Snake sequence 129
    1148 Priority Queue 129
    1149 вторая сумма двоичных последовательностей с одинаковой длиной 0313 129
    1150 Diameter of N-Ary Tree LeetCode Solution 129
    1151 Search an Element in Sorted Rotated Array 129
    1152 Red-Black Tree Introduction 129
    1153 Образки в парах 129
    1154 БЛИЧНЫЙ БОЛЬШОЙ ДРЕВОЙ ДЕРЕВО
    1155 Subset Sum Problem in O(sum) space 128
    1156 Maximum Product of Splitted Binary Tree LeetCode Solution 128
    1157 Bus Routes Leetcode Solution 128
    1158 Возможное решение LeetCode для двух разделов 128
    1159 Сравнение строк по частоте наименьшего символа Решение Leetcode 128
    1160 Check Array Formation Through Concatenation Leetcode Solution 128
    1161 Binary Tree to Binary Search Tree Conversion 128
    1162 Find Two Non-overlapping Sub -arrays Каждый с целевой суммой Решение LeetCode 128
    1163 Удалить максимальное количество ребер, чтобы граф оставался полностью проходимым Решение Leetcode 127
    1164 Web Crawler LeetCode Solution 127
    1165 Rotate Array 127
    1166 Merge two BSTs with limited extra space 127
    1167 Минимальная стоимость перемещения фишек в ту же позицию Решение LeetCode 127
    1168 Преобразование BST в дерево больших сумм 127
    1169 K’th Largest element in BST using constant extra space 127
    1170 Count Pairs Whose Products Exist in Array 127
    1171 Maximize sum of последовательные разности в круговом массиве 127
    1172 Дерево решений 127
    1173 Kth Наименьший код таблицы0313 127
    1174 Factorial Trailing Zeroes LeetCode Solution 127
    1175 Maximum Binary Tree 127
    1176 Longest Repeated Subsequence 126
    1177 Решение непрерывного массива LeetCode 126
    1178 Найти отсортированную подпоследовательность размера 3 за линейное время 126
    1179 Minimum Sideway Jumps LeetCode Solution 126
    1180 Find Largest Value in Each Tree Row LeetCode Solution 126
    1181 Search Suggestions System LeetCode Solution 126
    1182 Обратный путь в BST с использованием очереди0313 125
    1184 Дата переформатирования Решение LeetCode 125
    1185 Учитывая бинарное дерево, как удалить все половинки? 125
    1186 Maximum Depth Of Binary Tree 125
    1187 Find the smallest binary digit multiple of given number 125
    1188 Decrease Elements To Make Array Zigzag Решение LeetCode 125
    1189 Closest Leaf in a Binary Tree LeetCode Solution 124
    1190 Valid Triangle Number 124
    1191 Minimum Swaps To Make Sequences Increasing LeetCode Solution 124
    1192 Первая неверная версия 124
    1193 Действительное решение Perfect Square LeetCode 124
    1194 Matchsticks to Square Leetcode Solution 124
    1195 Maximum number of segments of lengths a, b and c 124
    1196 Sum of Left Leaves LeetCode Solution 124
    1197 Наименьший общий предок в двоичном дереве поиска 124
    1198 0313 124
    1199 Guess The Word 123
    1200 Maximum sum bitonic subarray 123
    1201 Graph and its representation 123
    1202 Преобразование отсортированного массива в двоичное дерево поиска. 0312 123
    1204 Swapping Nodes in a Linked List Leetcode Solution 123
    1205 Maximum sum of pairs with specific difference 122
    1206 Concatenation of Array LeetCode Solution 122
    1207 Запросы вероятности четного или нечетного числа в заданных диапазонах0313 122
    1209 Filter Restaurants by Vegan-Friendly, Price and Distance Leetcode Solution 122
    1210 Queue Reconstruction by Height 122
    1211 Moving Stones Until Consecutive Решение Leetcode 122
    1212 Новая 21 игра 122
    1213 Решение Crossing Leetcode0313 122
    1214 Maximum sum of a path in a Right Number Triangle 121
    1215 Champagne Tower LeetCode Solution 121
    1216 How to print maximum number of A с использованием заданных четырех ключей 121
    1217 Запрос суммы диапазона с использованием разреженной таблицы0313 121
    1219 Replace two consecutive equal values ​​with one greater 121
    1220 Range Queries for Longest Correct Bracket Subsequence 121
    1221 Print n terms of Newman Последовательность Conneway 120
    1222 УРОВНЕ 2D -вектор. 0313 120
    1224 Kth Smallest Element in a BST 120
    1225 Lowest Common Ancestor of a Binary Tree Leetcode Solution 120
    1226 Graph Cloning 120
    1227 Разрыв целого числа LeetCode Solution 120
    Преобразование Inte-Zcode 1228 um Преобразование Inte-Zcode 1228 um0313 120
    1229 Missing Number 120
    1230 BST to a Tree with Sum of all Smaller Keys 120
    1231 Perfect Squares LeetCode Solution 120
    1232 Проверить, являются ли все уровни двух двоичных деревьев анаграммами или нет
    1234 Arithmetic Slices II – Subsequence LeetCode Solution 119
    1235 Print modified array after multiple array range increment operations 119
    1236 Mean of range in array 119
    1237 Самый большой знак плюса Решение LeetCode 119
    1238 Список пропусков для дизайна Решение LeetCode 118
    1239 Longest Common Prefix Using Word by Word Matching 118
    1240 Sliding Window Median Leetcode Solution 118
    1241 Power of Two 118
    1242 Проверить, есть ли у каждого внутреннего узла BST ровно один потомок0313 117
    1244 Merge k Sorted Lists Leetcode Solution 117
    1245 Bold Words in String LeetCode Solution 117
    1246 Check for Identical BSTs without building the trees 117
    1247 Найти минимальное количество операций слияния для создания палиндрома массива 117
    1248 Maximize Elements Using Another Array 117
    1249 Maximum Array from Two given Arrays Keeping Order Same 117
    1250 Contiguous Array 117
    1251 Check Completeness of a Двоичное дерево Решение LeetCode 117
    1252 Параллельные курсы II Решение LeetCode 116
    1253 Find Minimum in Rotated Sorted Array II LeetCode Solution 116
    1254 Count Subsets Having Distinct Even Numbers 116
    1255 Min Cost Climbing Stairs LeetCode Solution 116
    1256 Минимум удалить, чтобы скобки стали действительными0313 116
    1258 Maximum Sum Increasing Subsequence 115
    1259 Verify Preorder Serialization of a Binary Tree 115
    1260 Image Overlap LeetCode Solution 115
    1261 Найти k-й наименьший элемент в BST (упорядочить статистику в BST)0313 114
    1263 Minimum Time to Collect All Apples in a Tree LeetCode Solution 114
    1264 Maximum Product Subarray 114
    1265 Next greater element 113
    1266 Проверка четного или нечетного числа в двоичном массиве, представленного подмассивом0313 113
    1268 Excel Sheet Column Title LeetCode Solution 113
    1269 Check if two nodes are on the same path in a Tree 113
    1270 Count and Переключение запросов к двоичному массиву 113
    1271 Наименьшее решение литкода диапазона II 113
    1272
    112
    1273 Different Ways to Add Parentheses Leetcode Solution 111
    1274 Check If a String Can Break Another String Leetcode Solution 111
    1275 Koko Eating Bananas Решение LeetCode 110
    1276 Слияние отсортированного массива 110
    Array Solution LeetCode 1277 30313 110
    1278 Number of elements less than or equal to a given number in a given subarray 110
    1279 Peeking Iterator LeetCode Solution 109
    1280 Largest Подматрица с перестановками Решение LeetCode 109
    1281 Проверить, может ли X дать сдачу каждому человеку в очереди 108
    1282 Newman–Shanks–Williams prime 108
    1283 Range Minimum Query (Square Root Decomposition and Sparse Table) 108
    1284 Queries for Decimal Values ​​of Subarrays of a Двоичный массив 107
    1285 Самая длинная подстрока, не содержащая повторяющихся символов0313 107
    1287 Arranging Coins Leetcode Solution 105
    1288 Number of indexes with equal elements in given range 105
    1289 Encoded String With Shortest Length LeetCode Solution 105
    1290 Максимальное произведение возрастающей подпоследовательности0313 104
    1292 Random Pick Index LeetCode Solution 104
    1293 Check given array of size n can represent BST of n levels or not 104
    1294 Minimum Возможное целое число после не более чем K смежных перестановок цифр Решение LeetCode 103
    1295 Найдите победителя круговой игры Решение LeetCode 103
    1296 Binary Tree to Binary Search Tree Conversion using STL set 103
    1297 Minimum Number of People to Teach LeetCode Solution 102
    1298 Palindrome Number LeetCode Solution 102
    1299 Insert Delete GetRandom O(1) Leetcode Solution 101
    1300
    101
    1301 Continuous Subarray Sum LeetCode Solution 101
    1302 Convert to Base -2 LeetCode Solution 101
    1303 Reach a Number LeetCode Solution 101
    1304 Сложить два числа II Решение литкода 101
    1305 Преобразовать BST в двоичное дерево так, чтобы сумма всех больших ключей добавлялась к каждому ключу 101
    1306 Number of Subsequences That Satisfy the Given Sum Condition LeetCode solution 100
    1307 Queries on XOR of greatest odd divisor of the range 100
    1308 Jump Game IV LeetCode Solution 100
    1309 Design Underground System Leetcode Solution 96
    1310 Print Maximum Length Chain of Pairs 95
    1311 Detect Capital Leetcode Solution 93
    1312 Shifting Letters LeetCode Solution 93
    1313 Design A Leaderboard Leetcode Решение 92
    1314 Подстрока с объединением всех слов Литкод Решение 88
    1315 Count Sub Islands LeetCode Solution 87
    1316 Minimum Path Sum Leetcode Solution 87
    1317 Minimum Swaps to Group All 1’s Together Leetcode Solution 86
    1318 Top K Frequent Elements Решение LeetCode 85
    1319 Нечетное Четное Связанный список Решение Leetcode 84
    1320 Binary Tree Inorder Traversal LeetCode Solution 84
    1321 Longest Common Subsequence LeetCode Solution 83
    1322 Maximum Population Year LeetCode Solution 81
    1323 Найдите решение LeetCode городского судьи 80
    1324 Найдите решение LeetCode городского судьи 80
    1325 Decode String Leetcode Solution 80
    1326 Best Meeting Point LeetCode Solution 80
    1327 Shortest Unsorted Continuous Subarray LeetCode Solution 78
    1328 Суммировать числа от корня к листу LeetCode Solution 77
    1329 Дизайн Добавить и найти слова Структура данных LeetCode Solution 74
    1330 Rectangle Overlap LeetCode Solution 74
    1331 Maximum Population Year LeetCode Solution 74
    1332 Flatten Binary Tree to Linked List LeetCode Solution 71
    1333 Оценка в скобках Решение LeetCode 71
    1334 Вставить в отсортированный круговой связанный список 9 Решение LeetCode 71
    1335 Stone Game IV LeetCode Solution 71
    1336 Range Sum Query 2D – Immutable LeetCode Solution 70
    1337 Is Graph Bipartite? Решение LeetCode 70
    1338 Действительный номер треугольника Решение LeetCode 69
    1339 Заказать решение Leet Recodes 1339 0313 67
    1340 Divide Chocolate LeetCode Solution 60
    1341 Step-By-Step Directions From a Binary Tree Node to Another LeetCode Solution 53
    1342 Range Сумма BST LeetCode Solution 49
    1343 Обратное целое решение LeetCode 47
    1344 30313 47
    1345 Sort Colors LeetCode Solution 44
    1346 Maximum Side Length of a Square with Sum Less than or Equal to Threshold LeetCode Solution 43
    1347 Повернуть строку Решение LeetCode 42
    1348 Номер столбца листа Excel0313 25
    1350 Maximum Size Subarray Sum Equals k Leetcode Solution 23
    1351 Camelcase Matching Leetcode Solution 22
    1352 High Five LeetCode Solution 22
    1353 Наибольшее количество камней, удаленных в той же строке или столбце Решение LeetCode 22
    1354 Решение Leetcode 21
    1355 Container With Most Water LeetCode Solution 20
    1356 Valid Anagram Leetcode Solution 20
    1357 Next Permutation LeetCode Solution 19
    1358 Максимальное решение LeetCode со скользящим окном 19
    1359 Поиск пикового элемента Решение LeetCode 19
    1360 Group Anagrams LeetCode Solution 18
    1361 Binary Search LeetCode Solution 18
    1362 Flatten Binary Tree to Linked List LeetCode Solution 18
    1363 Next Greater Element I Решение Leetcode 17
    1364 Пары песен с общей продолжительностью, кратной 60 Решение LeetCode 17
    1365 Valid Triangle Number LeetCode Solution 16
    1366 Group Shifted Strings Leetcode Solution 16
    1367 Paint House LeetCode Solution 16
    1368 Вставить Удалить GetRandom O(1) – дубликаты разрешены Решение LeetCode 15
    1369 Ближайшее значение дерева двоичного поиска II Решение LeetCode 15
    1370 Sentence Screen Fitting LeetCode Solution 15
    1371 Unique Binary Search Trees LeetCode Solution 15
    1372 Isomorphic Strings LeetCode Solution 15
    1373 Индекс пика в массиве Mountain Решение LeetCode 15
    1374 Решение LeeCode Минимальное количество стрел для взрыва шара 15
    1375 Плавать в поднимающейся воде Как мне их использовать?

    ПРИВЕТ! Сегодня мы поговорим о пулах потоков и распараллеливании вычислений. За последние несколько дней я узнал пару вещей об этом. В основном это будет о Java и JVM. Оказывается, есть много вещей, которые нужно знать о параллелизме в JVM, но, к счастью, многие люди знают эти вещи, так что вы можете их изучить!

    Пул потоков позволяет выполнять вычисления более чем в одном потоке одновременно. Допустим, у меня есть Super Slow Function, и я хочу запустить ее на 10 000 вещей, а у меня 32 ядра на процессоре. Тогда я смогу запустить свою функцию в 32 раза быстрее! Вот как это выглядит в Python.

     из multiprocessing.pool импорта ThreadPool
    определение медленной_функции():
        делай что угодно
    результаты = ThreadPool(32).map(slow_command, list_of_things)
     

    Это кажется очень простым, не так ли? Ну, я на днях пытался что-то распараллелить на Java (правда, на Scala), и это оказалось совсем не так просто. Поэтому я хотел рассказать вам о некоторых запутанных вещах, с которыми я столкнулся.

    Моя задача: запустить своего рода медленную функцию на 60 миллионах вещей. Он уже был распараллелен, но использовал только 8 из 32 ядер процессора. Я хотел, чтобы он использовал ВСЕ ИХ. Эту задачу можно было тривиально распараллелить, поэтому я думал, что это будет легко.

    заблокированные потоки

    Одна из первых вещей, которую я начал видеть, когда я посмотрел на свою программу с YourKit (отличный профайлер для JVM), был примерно таким (взято отсюда):

    Что это было красная штука?! Мои темы были «заблокированы». Что такое заблокированный поток?

    В Java поток «блокируется», когда он ожидает «монитор» на объекте. Когда я сначала погуглил, я подумал: «Эээ, что такое монитор?». Это когда вы используете синхронизацию, чтобы два разных потока не выполняли один и тот же код одновременно.

     // псевдокод scala
    класс Бла {
        переменная х = 1
        защита plus_one () {
            это.синхронизированный {
                х += 1
            }
        }
    }
     

    Эта синхронизация означает, что только одному потоку разрешено запускать эту x += 1 блоков за раз, чтобы вы случайно не попали в гонку. Если один поток уже выполняет x += 1 , другие потоки в конечном итоге, как вы уже догадались, БЛОКИРУЮТСЯ.

    Две вещи, которые блокировали мои потоки:

    • ленивые vals в Scala использовали синхронизированные внутри, и поэтому могут вызвать проблемы с параллелизмом
    • Double.parseDouble в Java 7 является синхронизированным методом. Таким образом, только один поток может одновременно анализировать двойные значения из строк. Действительно? Действительно. Они исправили это в Java 8, так что это хорошо.

    ожидающие темы

    Итак, я разблокировал несколько своих тем. Я думал, что выигрываю. Это было лишь отчасти правдой. Теперь многие мои темы были оранжевыми. Оранжевый означает, что треды похожи на «эй-ай-ай, я готов, но мне нечего делать».

    В этот момент мой код выглядел так:

     def doStuff(pool: FuturePool) {
        // FuturePool — это пул потоков
        пока не сделано {
            строки var = чтение_с_диска
            var parsedStuff = синтаксический анализ (строки)
            pool. submit(parsedSuff.map{expensiveFunction})
        }
    }
     

    Это была очень хорошая функция. Я отправлял работу в пул! Работа шла! В параллели!

    Но мой основной поток выполнял всю работу по отправке. И вы видите, что парсов (строк) ? Бывало и такое:

     главное: есть над чем работать!
    main: начать разбор
    пул потоков: хорошо, я готов к большему
    main: Я ВСЕ ЕЩЕ РАБОТАЮ
    main: хорошо, вот еще работа
     

    Основной поток не смог отправить дополнительную работу в пул потоков, потому что он был слишком занят синтаксическим анализом!

    Это как если бы вы попросили 5-летнего ребенка замесить тесто для торта, когда вы делаете сложное кухонное дело, а он такой: ОК, ОК, ОК, ОК, ОК, ЧТО ДАЛЬШЕ, а вы ВСЕГО МИНУТУ.

    Очевидным решением здесь было поручить синтаксический анализ потокам! Потому что потокам не 5 лет, и они могут делать все, что может основной поток. Поэтому я переписал свою функцию примерно так:

     def doStuff(pool: FuturePool):
        // FuturePool — это пул потоков
        // убедитесь, что у него только 32 потока, чтобы он
        // не раскручивает баджиллион потоков
        пока не сделано {
            строки var = чтение_с_диска
            pool. submit(parsedSuff.map{parse}.map{expensiveFunction})
        }
     

    ЗАМЕЧАТЕЛЬНО. Это было здорово, правда?

    Неправильно. Затем произошло следующее: OutOfMemoryError . Какая. Почему. Это подводит нас к…

    Рабочие очереди

    Эта абстракция FuturePool крутая. Просто дайте нитке поработать, и она сделает это! Не беспокойтесь о том, что внизу! Но теперь нам нужно понять, что находится под ним.

    В Java вы обычно обрабатываете пулы потоков с помощью чего-то, называемого ExecutorService . Это сохраняет пул потоков (скажем, 32 потока). Или он может быть неограничен! В этом случае я хотел иметь столько потоков, сколько у меня есть ядер процессора.

    Допустим, я запускаю ExecutorService.submit(work) 32 раза, и есть только 32 потока. Что происходит в 33-й раз? Ну, ExecutorService поддерживает внутреннюю очередь работы. Таким образом, он держится за вещь 33 и делает что-то вроде

     loop {
        если (имеет_доступный_поток) {
            available_thread. submit(queue.pop())
        }
    }
     

    В моем случае я считывал кучу данных с диска. может быть 10 ГБ данных. И я отправлял все эти данные в рабочую очередь ExecutorService. Неудивительно, что очередь взорвалась и разбила мою программу.

    Я попытался исправить это, изменив внутреннюю очередь в ExecutorService на ArrayBlockingQueue с размером 100, чтобы она не принимала неограниченный объем работы. Потрясающий!

    еще не сделано

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

    Думаю, мне нужно сделать следующее:

    • прочитать с диска
    • отправить работу в ExecutorService. Но с ограниченной очередью!!
    • поймать исключение из ExecutorService, когда ему не удается запланировать работу, подождать и повторить попытку
    • и т. д. и т. д.

    Или, может быть, есть совсем простой способ, и это может занять у меня 5 минут!

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

    Теперь я не чувствую себя плохо, обычно я просто такой: ХОРОШО СЕГОДНЯ — ДЕНЬ, КОГДА Я УЗНАЮ ЭТО. А завтра я буду еще круче, чем сегодня. Что довольно круто =D

    Абстракции

    Я думаю, что абстракции пула потоков, с которыми я работаю в Scala, не самые лучшие абстракции. Не потому, что они не облегчают программирование с параллелизмом — они делают!

    Но лучшие абстракции, с которыми я работаю (сетевой уровень TCP/IP! каналы unix!) позволяют мне использовать их годами, ни в малейшей степени не понимая, как они работают.

    Добавить комментарий

    Ваш адрес email не будет опубликован.