Традиционная мудрость говорит нам о том, что приложения большого объема для предприятий Java должны использовать объединение потоков, предпочитая создавать новые рабочие потоки. Использование java.util.concurrent
делает это простым.Накладные расходы на создание потоков Java
Однако существуют ситуации, когда объединение потоков не подходит. Конкретным примером, с которым я в настоящее время занимаюсь, является использование InheritableThreadLocal
, которое позволяет передавать ThreadLocal
переменным в любые порожденные потоки. Этот механизм прерывается при использовании пулов потоков, поскольку рабочие потоки, как правило, не генерируются из потока запросов, но уже существуют.
Теперь есть способы обойти это (локаторы потоков могут быть явно переданы), но это не всегда удобно или практично. Самое простое решение - порождать новые рабочие потоки по требованию, и пусть InheritableThreadLocal
выполняет свою работу.
Это возвращает нас к вопросу - если у меня есть сайт с большим объемом, где потоки запросов пользователей порождают полдюжины рабочих потоков каждый (т. Е. Не используют пул потоков), это даст JVM a проблема? Мы потенциально говорим о создании нескольких сотен новых потоков каждую секунду, каждая из которых длится менее секунды. Могут ли современные JVM оптимизировать это? Я помню дни, когда объединение объектов было желательно в Java, потому что создание объекта было дорогостоящим. С тех пор это стало ненужным. Мне интересно, если это относится к пулу потоков.
Я бы оценил это, если бы знал, что измерить, но я боюсь, что проблемы могут быть более тонкими, чем можно измерить с помощью профилировщика.
Примечание: мудрость использования локаторов потоков не является проблемой здесь, поэтому, пожалуйста, не предлагайте, чтобы я не использовал их.
Я собирался предположить, что упаковка ThreadLocal в методе доступа, вероятно, решит ваши проблемы с InheritableThreadLocal, но вы, похоже, не хотите этого слышать. Кроме того, кажется, что вы используете InheritableThreadLocal в качестве внеполосного кадра вызова, что, если честно, похоже на запах кода. – kdgregory
Что касается пулов потоков, основное преимущество - контроль: вы знаете, что вы не будете внезапно пытаться развернуть 100 000 потоков за секунду. – kdgregory
@kdgregory: для вашей первой точки, ThreadLocals, о которой идет речь, используются в области подсчета компонентов Spring. Так работает Весна, а не то, что я контролирую. Для вашей второй точки потоки входящих запросов ограничены пулом потоков tomcat, поэтому ограничение присуще этому. – skaffman