Как назвать потоки пула потоков в Java
У меня есть приложение Java, которое использует структуру Executor
, и у меня есть код, который выглядит так:
protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)
Я понимаю, что внутри JVM создаст пул из 5 потоков. Теперь, когда я проверяю выполнение в профилировщике, я получаю что-то вроде thread-pool2,thread-pool3
и т.д.
Some of these thread pools are created by the server and some are created by me
, мне нужен способ дифференцировать, которые были созданы мной и которые были созданы сервером.
Я думаю, что если я могу назвать пулы потоков, он должен сделать трюк, однако не вижу никакого API, который позволил бы мне сделать то же самое.
Спасибо заранее.
Ответы
Ответ 1
Вы можете передать свой ThreadFactory в ScheduledThreadPoolExecutor. Ваш ThreadFactory создаст поток и может дать ему любое имя, которое вы хотите. Ваш ThreadFactory также может повторно использовать Executors.defaultThreadFactory() и только изменить имя перед возвратом потока.
Ответ 2
public class NamedThreadPoolExecutor extends ThreadPoolExecutor {
private static final String THREAD_NAME_PATTERN = "%s-%d";
public NamedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, final TimeUnit unit,
final String namePrefix) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(),
new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
final String threadName = String.format(THREAD_NAME_PATTERN, namePrefix, counter.incrementAndGet());
return new Thread(r, threadName);
}
});
}
}
Ответ 3
Из документа ThreadPoolExecutor :
Создание новых потоков Новые потоки создаются с помощью ThreadFactory. Если не указано иное, используется Executors.defaultThreadFactory(), который создает потоки для всех в одной и той же ThreadGroup и с тем же приоритетом NORM_PRIORITY и не-демоном. Поставляя другой ThreadFactory, вы можете изменить имя потока, группу потоков, приоритет, статус демона и т.д. Если ThreadFactory не сможет создать поток, когда его спросят, возвратив null из newThread, исполнитель продолжит, но может не выполнять какие-либо задачи.
Ответ 4
Используйте свой собственный поток factory. Внедрите ThreadFactoryBuilder для создания пользовательских фабрик потоков, которые позволят вам выполнить следующие действия:
- У пользовательских имен потоков
- У вас есть выбор потоков - потоки пользователей или Daemon
- Выберите приоритет потока
- Уметь гибко настраивать обработчики исключенных обработчиков.
У вас есть пример реализации ThreadFactoryBuilder в следующем сообщении, которое вы можете использовать.
http://wilddiary.com/understanding-java-threadfactory-creating-custom-thread-factories/