Допустим, у меня есть приложение, которое использует Executor
фреймворк как таковой
Executors.newSingleThreadExecutor().submit(new Runnable(){
@Override
public void run(){
// do stuff
}
}
Когда я запускаю это приложение в отладчик, поток создается с именем следующей ( по умолчанию): Thread[pool-1-thread-1]
. Как видите, это не очень полезно, и, насколько я могу судить, Executor
инфраструктура не предоставляет простой способ назвать созданные потоки или пулы потоков.
Итак, как можно обеспечить имена для потоков / пулов потоков? Так , например, Thread[FooPool-FooThread]
.
Вы можете попытаться предоставить собственную фабрику потоков, которая будет создавать потоки с соответствующими именами. Вот один пример:
источник
Вы также можете впоследствии изменить имя вашего потока, пока поток выполняется:
Это может быть интересно, если, например, вы используете одну и ту же ThreadFactory для разных типов задач.
источник
(Note however that if this single thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks.)
. Если ExecutorService заменяет поток, он будет назван ThreadFactory. Опять же, видение исчезновения имени во время отладки может быть полезным индикатором.Параметр
BasicThreadFactory
from apache commons-lang также полезен для обеспечения поведения именования. Вместо того, чтобы писать анонимный внутренний класс, вы можете использовать Builder для именования потоков так, как вы хотите. Вот пример из Javadocs:источник
Если вы используете Spring,
CustomizableThreadFactory
для этого вы можете установить префикс имени потока.Пример:
Кроме того, вы можете создать свой
ExecutorService
объект как Spring bean, используяThreadPoolExecutorFactoryBean
- тогда все потоки будут названы сbeanName-
префиксом.В приведенном выше примере потоки будут названы с
myExecutor-
префиксом. Вы можете явно установить префикс на другое значение (например,"myPool-"
), установивexecutorFactoryBean.setThreadNamePrefix("myPool-")
на заводском компоненте.источник
Для этого есть открытый RFE с Oracle. Судя по комментариям сотрудника Oracle, они не понимают проблему и не решат ее. Это одна из тех вещей, которые очень просто поддерживать в JDK (не нарушая обратной совместимости), поэтому стыдно, что RFE неправильно поняли.
Как уже указывалось, вам нужно реализовать свой собственный ThreadFactory . Если вы не хотите использовать Guava или Apache Commons только для этой цели, я приведу здесь
ThreadFactory
реализацию, которую вы можете использовать. Это в точности похоже на то, что вы получаете из JDK, за исключением возможности установить для префикса имени потока нечто иное, чем «пул».Когда вы хотите использовать его, вы просто используете тот факт, что все
Executors
методы позволяют вам предоставить свои собственныеThreadFactory
.это
даст ExecutorService, где имена потоков,
pool-N-thread-M
но с помощьювы получите ExecutorService, где названы потоки
primecalc-N-thread-M
. Вуаля!источник
ThreadGroup
в пользуThreadPoolExecutor
.Передайте ThreadFactory в службу executor, и все готово
источник
Быстрый и грязный способ заключается в использовании
Thread.currentThread().setName(myName);
вrun()
методе.источник
Расширить ThreadFactory
public interface ThreadFactory
Thread newThread(Runnable r)
Образец кода:
вывод:
....и т.д
источник
Как уже говорилось в других ответах, вы можете создать и использовать собственную реализацию
java.util.concurrent.ThreadFactory
интерфейса (внешние библиотеки не требуются). Я вставляю свой код ниже, потому что он отличается от предыдущих ответов, поскольку он используетString.format
метод и принимает базовое имя для потоков в качестве аргумента конструктора:И это пример использования:
РЕДАКТИРОВАТЬ : сделать мою
ThreadFactory
реализацию потокобезопасной, спасибо @mchernyakov за указание на это.Несмотря на то, что нигде в
ThreadFactory
документации не сказано, что его реализации должны быть поточно-ориентированными, тот факт, чтоDefaultThreadFactory
поточнобезопасность, является большой подсказкой:источник
Самодельное ядро Java-решение, которое я использую для украшения существующих фабрик:
В действии:
источник
источник
Вы можете написать свою собственную реализацию ThreadFactory, используя, например, некоторую существующую реализацию (например, defaultThreadFactory) и изменить имя в конце.
Пример реализации ThreadFactory:
И использование:
источник
Я использую, чтобы сделать то же самое, как показано ниже (требуется
guava
библиотека):источник
ThreadFactoryBuilder
это из библиотеки Google Guava.Я считаю, что проще всего использовать лямбду в качестве фабрики потоков, если вы просто хотите изменить имя одного исполнителя потоков.
источник
main@1, Finalizer@667, Reference Handler@668, Your name@665, Signal Dispatcher@666
Это моя индивидуальная фабрика, предоставляющая индивидуальные имена для анализаторов дампа потоков. Обычно я просто даю
tf=null
повторно использовать фабрику потоков JVM по умолчанию. Этот сайт имеет более продвинутую фабрику ниток.Для вашего удобства это цикл дампа потока для отладки.
источник