Thread.setName (имя) предостережения - PullRequest
5 голосов
/ 04 апреля 2011

У меня есть многопоточное клиент-серверное приложение, которое использует сокеты. Когда новое соединение найдено, дальнейшее выполнение переносится в новый поток с использованием нового пула потоков Executors.

Я хочу зарегистрировать идентификатор клиента во всех операторах регистрации для этого клиента. Проблема в том, что я не хочу изменять сигнатуры методов просто для передачи идентификатора клиента.

Решения, о которых я подумал:

  1. Использование ThreadLocal для хранения значения клиента.
  2. В run () я могу установить идентификатор клиента в Thread, используя Thread.currentThread (). SetName (clientId);

Сначала надо работать. Но мне нравится второй вариант, потому что а. Я могу найти идентификатор клиента из отладчика б. Библиотека журнала может быть настроена для отображения имени потока. Таким образом, никаких изменений в инструкциях журнала не потребуется, и это также будет работать для регистраторов внутри библиотек.

Каковы предостережения для использования thread.setName () помимо тех, которые упомянуты в javadoc? Как это влияет на производительность? Пиковая частота вызовов thread.setName () будет около 200 в секунду, а в среднем около 0,3 в секунду.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

Если вы используете Log4j, существует специальный механизм для обработки этого типа шаблона ведения журнала, разделенный между двумя классами org.apache.log4j.NDC и org.apache.log4j.MDC ('Вложенные и сопоставленные контексты диагностики').

Просмотрите NDC и MDC - Какой из них мне следует использовать? , чтобы увидеть, какой из них лучше использовать в вашей конкретной ситуации..

Вот еще одна ссылка, которая описывает использование MDC более практично: Создание гибких журналов с log4j - O'Reilly Media

Обратите внимание, что основной механизм хранения MDC /NDC использует (я считаю) ThreadLocal в любом случае.

2 голосов
/ 04 апреля 2011

Каковы предостережения для использования thread.setName () помимо тех, которые упомянуты в javadoc? Как это влияет на производительность? Пиковая частота вызова thread.setName () будет около 200 в секунду и в среднем около 0,3 в секунду.

Производительность не должна быть серьезной проблемой. Thread.setName() выполняет проверку безопасности, а затем копирует / устанавливает атрибут. Проверка безопасности должна быть дешевой, если только ваш код не является привилегированным кодом, выполняющимся в изолированной программной среде безопасности, которая запрещает непривилегированные вызовы метода Thread.setName().

Единственное другое предостережение, о котором я могу подумать, это то, что имена потоков, постоянно меняющиеся, могут сбивать с толку, если вы пытаетесь отлаживать поведение потоков; например глядя на дампы потоков и т. д.

1 голос
/ 04 апреля 2011

Я использую ваш второй подход в разрабатываемом программном обеспечении (принтсервер), но потоки работают долго, поэтому setName () не добавляет задержки при обработке.Фаза регистрации очень хороша, показывая имя потока.

Я думаю, что setName () является проблемой в двух случаях:

  1. очень короткий прогон;используется большим количеством актеров с другим идентификатором (но это не ваш контекст или нет?).

пока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...