У меня есть многопоточное клиент-серверное приложение, которое использует сокеты. Когда новое соединение найдено, дальнейшее выполнение переносится в новый поток с использованием нового пула потоков Executors.
Я хочу зарегистрировать идентификатор клиента во всех операторах регистрации для этого клиента. Проблема в том, что я не хочу изменять сигнатуры методов просто для передачи идентификатора клиента.
Решения, о которых я подумал:
- Использование ThreadLocal для хранения значения клиента.
- В run () я могу установить идентификатор клиента в Thread, используя Thread.currentThread (). SetName (clientId);
Сначала надо работать. Но мне нравится второй вариант, потому что
а. Я могу найти идентификатор клиента из отладчика
б. Библиотека журнала может быть настроена для отображения имени потока. Таким образом, никаких изменений в инструкциях журнала не потребуется, и это также будет работать для регистраторов внутри библиотек.
Каковы предостережения для использования thread.setName () помимо тех, которые упомянуты в javadoc? Как это влияет на производительность? Пиковая частота вызовов thread.setName () будет около 200 в секунду, а в среднем около 0,3 в секунду.