的实例
java.lang.Thread不是线程;它可以用来表示JVM中的执行线程,但是JVM完全能够创建线程而无需使用
Thread类。
这就是主线程发生的情况:JVM创建了它,并创建了一个实例
java.lang.Thread来表示它。
在Hotspot JVM
Threads中,
src/share/vm/runtime/thread.hppand中定义的类中有很多与线程相关的代码
src/share/vm/runtime/thread.cpp。JVM的启动将调用静态
Threads::create_vm功能,该功能已在操作系统设置的线程中运行。在该函数中,我们发现:
(src/share/vm/runtime/thread.cpp)3191 // Attach the main thread to this os thread3192 JavaThread* main_thread = new JavaThread();3193 main_thread->set_thread_state(_thread_in_vm);3194 // must do this before set_active_handles and initialize_thread_local_storage3195 // Note: on solaris initialize_thread_local_storage() will (indirectly)3196 // change the stack size recorded here to one based on the java thread3197 // stacksize. This adjusted size is what is used to figure the placement3198 // of the guard pages.3199 main_thread->record_stack_base_and_size();3200 main_thread->initialize_thread_local_storage();
的
JavaThread类显然用于簿记; 它将OS或VM线程与Java
Thread对象相关联。Java对象显然尚不存在。然后,代码继续初始化各种其他内容,随后仍然在同一函数中找到以下内容:
3335 // Initialize java_lang.System (needed before creating the thread)3336 if (InitializeJavaLangSystem) {3337 initialize_class(vmSymbols::java_lang_System(), CHECK_0);3338 initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK_0);3339 Handle thread_group = create_initial_thread_group(CHECK_0);3340 Universe::set_main_thread_group(thread_group());3341 initialize_class(vmSymbols::java_lang_Thread(), CHECK_0);3342 oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);3343 main_thread->set_threadObj(thread_object);3344 // Set thread status to running since main thread has3345 // been started and running.3346 java_lang_Thread::set_thread_status(thread_object,3347 java_lang_Thread::RUNNABLE);换句话说,我们把它初始化
System,
ThreadGroup和
Thread类,然后创建的实例
Thread通过参考
thread_object(线3342),并设定了
Thread用于主实例
JavaThread。
如果您想知道它的
create_initial_thread作用,那么显然它会分配Thread实例,将指向
JavaThread(C
++)对象的指针存储在Thread实例的私有
eetop字段中,将线程优先级字段设置为normal,调用
Thread(ThreadGroupgroup,String name)构造函数,然后返回该实例:
967 // Creates the initial Thread 968 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) { 969 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_ NULL); 970 instanceKlassHandle klass (THREAD, k); 971 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL); 972 973 java_lang_Thread::set_thread(thread_oop(), thread); 974 java_lang_Thread::set_priority(thread_oop(), NormPriority); 975 thread->set_threadObj(thread_oop()); 976 977 Handle string = java_lang_String::create_from_str("main", CHECK_NULL); 978 979 JavaValue result(T_VOID); 980 JavaCalls::call_special(&result, thread_oop, 981 klass, 982 vmSymbols::object_initializer_name(), 983 vmSymbols::threadgroup_string_void_signature(), 984 thread_group, 985 string, 986 CHECK_NULL); 987 return thread_oop(); 988 }现在,这就是Hotspot VM所做的。不过,其他实现(例如IBM J9,Oracle JRockit或Azul Zing)可能也会执行类似的操作。



