Я не думаю, что это вообще реально, так как вы создаете новую службу executor каждый раз, когда делаете вызов метода. Если у вас нет очень странных требований, которые кажутся нереальными - обычно вы создаете сервис при запуске приложения, а затем отправляете ему задания.
Если вы снова попробуете сравнительный анализ, но инициализируете службу как поле , один раз, вне цикла синхронизации; тогда вы увидите фактические накладные расходы, связанные с отправкой Runnables в службу и выполнением их самостоятельно.
Но я не думаю, что вы полностью поняли суть - исполнители не предназначены для повышения эффективности, они там для того, чтобы упростить координацию и передачу работы пулу потоков. Они всегда будут менее эффективными, чем просто вызов Runnable.run()
самостоятельно (поскольку в конце дня служба исполнителя все еще должна сделать это, предварительно выполнив некоторые дополнительные действия по ведению домашнего хозяйства). Когда вы используете их из нескольких потоков, нуждающихся в асинхронной обработке, они действительно сияют.
Также учтите, что вы смотрите на относительную разницу во времени по существу с фиксированными затратами (накладные расходы исполнителя равны, независимо от того, выполняются ли ваши задачи 1 мс или 1 час) по сравнению с очень маленькой переменной величиной (ваш тривиальный пробег) Если для выполнения задачи в 1 мс службе исполнителя требуется 5 мс, это не очень благоприятный показатель. Если для выполнения 5-секундной задачи требуется дополнительно 5 мс (например, нетривиальный SQL-запрос), это совершенно незначительно и стоит того.
Так что, в некоторой степени, это зависит от вашей ситуации - если у вас есть чрезвычайно критичный ко времени раздел, выполняющий множество небольших задач, которые не нужно выполнять параллельно или асинхронно, тогда вы ничего не получите от исполнителя , Если вы обрабатываете более тяжелые задачи параллельно и хотите отвечать асинхронно (например, через веб-приложение), тогда исполнители - это здорово.
То, являются ли они лучшим выбором для вас, зависит от вашей ситуации, но на самом деле вам нужно попробовать тесты с реалистичными репрезентативными данными. Я не думаю, что было бы уместно делать какие-либо выводы из проведенных вами тестов, если только ваши задачи не являются настолько тривиальными (и вы не хотите повторно использовать экземпляр executor ...).