Явское создание нити наверху

Расхожее мнение говорит нам, что JAVA-приложения предприятия большого объема должны использовать объединение нити в предпочтении к порождению новых нитей рабочего. Использование java.util.concurrent делает это прямым.

Там существуйте ситуации, однако, где объединение нити не подходящий вариант. Определенным примером, с которым я в настоящее время борюсь, является использование InheritableThreadLocal, который позволяет ThreadLocal переменные, которые будут «переданы» к любым порожденным нитям. Этот механизм ломается, используя фонды нити, так как нити рабочего обычно не порождаются от нити запроса, но существуют ранее.

Теперь есть пути вокруг этого (местные жители нити могут быть явно встречены в), но это не всегда соответствующее или практичное. Самое простое решение состоит в том, чтобы породить новые нити рабочего по требованию и позволить InheritableThreadLocal сделайте его работу.

Это возвращает нас вопросу - если у меня есть место большого объема, где пользовательские нити запроса порождают от полудюжины нитей рабочего каждого (т.е. не используют фонд нити), это собирается дать JVM проблему? Мы потенциально говорим приблизительно несколько сотен новых ветвей дискуссии, создаваемых каждую секунду, каждый продержавшийся меньше, чем секунда. Современные JVMs оптимизируют это хорошо? Я помню дни, когда объединение объекта было желательно на Яве, потому что создание объекта было дорогим. Это с тех пор стало ненужным. Я задаюсь вопросом, применяется ли то же к объединению нити.

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

Примечание: мудрость использования местных жителей нити не является проблемой здесь, поэтому, пожалуйста, не предлагайте, чтобы я не использовал их.

45
задан skaffman 22 January 2010 в 12:11
поделиться

3 ответа

Прежде всего, эта воля, конечно, очень сильно зависит от того, какой JVM вы используете. ОС также будет играть важную роль. Предполагая, что солнца JVM (HM, мы все еще называем это этим?):

Один основной фактор - это память стека, выделенная для каждого потока, которую вы можете настроить с помощью -XSSN параметра JVM - вы хочу использовать самую низкую ценность, с которой вы можете уйти.

И это просто предположение, но я думаю, что «пару сотен новых нитей каждую секунду», безусловно, помимо того, что JVM предназначен для удобного решения. Я подозреваю, что простой ориентир быстро раскрывает довольно необычные проблемы.

9
ответ дан 26 November 2019 в 21:29
поделиться

Мне интересно, необходимо ли появлять новые потоки на каждый запрос пользователей, если их типичный жизненный цикл, как в секунду. Не могли бы вы использовать какую-то очередь уведомления / ожидания ждать, где вы порождаете данное количество (демона) потоков, и все они ждут, пока не будет решить задачу. Если очередь задач становится долго, вы порождаете дополнительные потоки, но не на соотношении 1-1. Скорее всего, он будет лучше выполнять, чем нерест сотни новых нитей, жизненные циклы которых такие короткие.

0
ответ дан 26 November 2019 в 21:29
поделиться
  • для вашего эталона можно использовать jmeter + профилировщик, который должен дать вам прямой обзор по поведению в таком тяжелом загруженная среда. Просто позвольте ему работать в течение часа и мониторинга памяти, CPU и т. Д. Если ничего не сломается, и ЦП (ы) не перегревается, все в порядке :)

  • Возможно, вы можете получить пул резьбы или настроить (продлен ) Тот, который вы используете, добавив какой-нибудь код, чтобы иметь соответствующий , установленный наследственному элементу , каждый раз, когда поток приобретается из пула резьбы. Каждый нить имеет эти пакет-частные свойства:

     / * NEMLOCAL Значения, относящиеся к этой нити.  Эта карта поддерживается
      * ThreadLocal Class.  * /
    ThreadLocal.threadlocalMap ThreadloCals = NULL;
    
     / *
      * Наследование значения, относящиеся к этой теме.  Эта карта
      * поддерживается уклоном наследственному элементам.
      * /
    ThreadLocal.threadLocalmap наследовать усилитель = NULL;
     

    Вы можете использовать эти (ну с отражением) в сочетании с нитью . CurrentThread () , чтобы иметь желаемое поведение. Однако это немного Ad-Hock, и, кроме того, я не могу сказать, нельзя ли это (с отражением), не будет вводить даже больше, чем просто создание потоков.

1
ответ дан 26 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: