Манипулировать реализацией потоков в JVM - PullRequest
1 голос
/ 21 июля 2011

Недавно я работал над развертыванием параллельных объектов на многоядерных системах.В качестве примера я использую метод BlockingQueue.take(), в спецификации которого указано, что это блокировка .Это означает, что метод не освобождает ресурсы окружающего потока, так что его можно использовать повторно для других одновременных задач.Это полезно, так как общее количество активных потоков в экземпляре JVM ограничено, и если приложению потребуются тысячи активных потоков, жизненно важно иметь возможность повторно использовать приостановленные потоки.С другой стороны, JVM использует отображение 1: 1 из потоков уровня приложения в потоки уровня ОС в Java;т.е. каждый экземпляр потока Java становится базовым потоком уровня ОС.

Текущее решение основано на java.util.concurrency в Java 1.5+.Тем не менее, нам нужны рабочие потоки, которые можно масштабировать до большого количества.Теперь мне интересно найти следующие ответы:

  • Можно ли заменить реализацию java.lang.Thread в JVM так, чтобы я мог подключить свою собственную реализацию Thread?
  • Возможно ли это только путем настройки разделов C ++ реализации потока в JVM и перекомпиляции его?
  • Существует ли какая-либо библиотека, обеспечивающая способ замены классического потока в Java?1018 * Опять же, в той же строке, есть ли библиотека или способ указать, как некоторые потоки в Java могут быть сопоставлены с только одним потоком на уровне ОС?

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

Заранее спасибо за ваши комментарии и идеи.

1 Ответ

1 голос
/ 21 июля 2011

Если вы создаете тысячи потоков, вы делаете это неправильно.

Вместо этого рассмотрите возможность использования платформы Executor. (Начните с классов Executors и ThreadPoolExecutor.) Они позволяют ставить в очередь тысячи задач, имея при этом достаточное количество потоков, обрабатывающих их.

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

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

...