Каждый поток получит собственный поток ОС для RUN, который может работать на другом процессоре, но, поскольку Java интерпретируется, этим потокам потребуется снова и снова взаимодействовать с JVM для преобразования байтового кода в машинные инструкции?Я прав?
Вы смешиваете две разные вещи;JIT, сделанный VM, и поддержка потоков, предлагаемая VM.В глубине души все, что вы делаете, переводится в какой-то нативный код.Инструкция байт-кода, которая использует поток, ничем не отличается от кода JIT, который обращается к потокам.
Если да, то для небольших программ Java Threads не будет большим преимуществом?
Определите маленький здесь.Для кратковременных процессов, да, многопоточность не имеет большого значения, так как ваше последовательное выполнение достаточно быстро.Обратите внимание, что это снова зависит от решаемой проблемы.Для наборов инструментов пользовательского интерфейса, независимо от того, насколько маленьким является приложение, для поддержания отзывчивости пользовательского интерфейса требуется какое-то многопоточное / асинхронное выполнение.
Потоки также имеют смысл, когда у вас есть вещи, которые можно запуститьв параллели.Типичным примером будет выполнение тяжелых операций ввода-вывода в потоке и вычислений в другом.Вы действительно не захотите блокировать свою обработку только потому, что ваш основной поток блокируется с помощью ввода-вывода.
Как только Hotspot компилирует оба эти пути выполнения, оба могут быть такими же хорошими, как и собственные потоки?Я прав?
См. Мое первое замечание.
Потоки действительно не являются серебряной пулей, особенно, когда дело доходит до распространенного заблуждения о "использовании потоков, чтобы заставить этот код идтиБыстрее".Чтение и опыт будут вашим лучшим выбором.Могу ли я порекомендовать получить копию этой удивительной книги ?: -)
@ Sanjay: Infact теперь я могу перефразировать мой вопрос.Если у меня есть Поток, чей код не был JIT, как его выполняет ОС?
Опять же, я скажу, что многопоточность - это совершенно другое понятие, чем JIT.Давайте попробуем взглянуть на выполнение программы в простых терминах:
java pkg.MyClass -> VM находит метод для запуска -> Начать выполнение байт-кода для метода строка за строкой ->преобразовать каждую инструкцию байт-кода в ее собственный аналог -> инструкцию, выполняемую ОС -> инструкцию, выполняемую машиной
Когда JIT включился:
java pkg.MyClass-> ВМ находит метод для запуска , который был JIT'ed -> находит соответствующий собственный код для этого метода -> инструкция, выполняемая ОС -> инструкция, выполняемая машиной
Как видите, независимо от маршрута, по которому вы идете, инструкция VM должна быть сопоставлена с ее собственным аналогом в определенный момент времени.Сохраняется ли этот нативный код для дальнейшего повторного использования или выбрасывается, если что-то другое (оптимизация, помните?).
Следовательно, чтобы ответить на ваш вопрос, всякий раз, когда вы пишете многопоточный код, он равен перевод на родной код и запуск на ОС.Независимо от того, выполняется ли этот перевод на лету или просматривается в тот момент времени, это совершенно другой вопрос.