栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java如何创建主线程

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何创建主线程

的实例

java.lang.Thread
不是线程;它可以用来表示JVM中的执行线程,但是JVM完全能够创建线程而无需使用
Thread
类。

这就是主线程发生的情况:JVM创建了它,并创建了一个实例

java.lang.Thread
来表示它。

在Hotspot JVM

Threads
中,
src/share/vm/runtime/thread.hpp
and中定义的类中有很多与线程相关的代码
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)可能也会执行类似的操作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/410282.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号