Java Что происходит, когда поток запускается до тех пор, пока он не начнет выполняться

Какова последовательность событий, происходящих между вызовом Thread.start и вызовом Thread.run? Я спрашиваю, потому что в основном из любопытства и потому, что я не могу отследить нативные вызовы, чтобы найти их реализацию, но также и для того, чтобы ответить на некоторые мои вопросы о том, что я могу ожидать после запуска Thread.

Этот вопрос дает хороший ответ высокого уровня, но я m ищу более подробный ответ + возможны ссылки на исходный код.


person Eliezer    schedule 12.01.2016    source источник
comment
Я ищу более подробное объяснение того, что происходит в нативном коде + ссылки на нативный код, если это возможно.   -  person Eliezer    schedule 12.01.2016
comment
Тогда отозвали закрытое голосование.   -  person Adam Sznajder    schedule 12.01.2016
comment
... Я не могу отследить нативные вызовы, чтобы найти их реализацию... Установите Mercurial и проверьте исходные коды OpenJDK. Это все есть.   -  person Stephen C    schedule 12.01.2016
comment
@StephenC Я сделал это, но я не эксперт OpenJDK и, похоже, не могу найти путь от кода JNI к реализации (в частности, коду JVM_).   -  person Eliezer    schedule 12.01.2016
comment
Я не знаю ответа, но если вы ищете, где происходит волшебство, большая его часть будет в операционной системе, а не в JVM. JVM вероятно вызовет ОС для создания нового потока и его стека. Затем родной код нового потока вероятно выполнит вызов JNI в какой-то закрытый метод Thread, который делает не знаю что перед вызовом this.run().   -  person Solomon Slow    schedule 12.01.2016


Ответы (2)


Я не уверен, как подключается каждый нативный метод Java-потока, но Java-потоки используют pthreads на нативном уровне. https://en.wikipedia.org/wiki/POSIX_Threads

Метод Thread#start в Java создает (и запускает) VMThread, поддерживаемый потоком pthread. VMThread поддерживается JNI, и большинство его вызовов заканчиваются на vm/Thread.c (например, https://android.googlesource.com/platform/dalvik/+/eclair-release/vm/Thread.c).

Например. VMThread#create вызывает метод JNI Dalvik_java_lang_VMThread_create, который вызывает функцию dvmCreateInterpThread в vm/Thread.c

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

person Streets Of Boston    schedule 20.01.2016
comment
Спасибо! Немного староват, потому что это код эклера, но он указал мне правильное направление. - person Eliezer; 21.01.2016

Улицы Бостона указали мне правильное направление, где я нашел https://android.googlesource.com/platform/art/+/marshmallow-release/runtime/ . Я обновлю этот ответ, как только у меня будет возможность прочитать код и понять его.

person Eliezer    schedule 20.01.2016