Executors # newSingleThreadExecutor () создает ThreadPoolExecutor объект под капотом,
см. код здесь: http://www.docjar.com/html/api/java/util/concurrent/Executors.java.html
133 public static ExecutorService newSingleThreadExecutor() {
134 return new FinalizableDelegatedExecutorService
135 (new ThreadPoolExecutor(1, 1,
136 0L, TimeUnit.MILLISECONDS,
137 new LinkedBlockingQueue<Runnable>()));
138 }
Документация ThreadPoolExecutor объясняет, в каких ситуациях он дает преимущества:
Пулы потоков решают две разные проблемы: они обычно предоставляют
улучшена производительность при выполнении большого количества асинхронных
задач из-за уменьшения накладных расходов на вызовы, и они обеспечивают
средства связывания и управления ресурсами, включая потоки,
расходуется при выполнении набора задач. Каждый ThreadPoolExecutor
также поддерживает некоторые основные статистические данные, такие как количество завершенных
задачи.
Если все, что вам нужно, это просто запускать один поток только время от времени (скажем, раз в час), то с точки зрения производительности использование ThreadPoolExecutor
может быть медленнее, так как вам нужно создать экземпляр всего механизма (pool + нить), затем выбросьте его из памяти.
Но если вы хотите использовать этот отдельный поток часто (скажем, каждые 15 секунд), тогда преимущество заключается в том, что вы создаете пул и поток только один раз , сохраняете его в памяти и используете его все время экономит время, создавая новый поток время от времени (который может быть довольно дорогим, если вы хотите использовать его, скажем, каждые 15 секунд или около того).