Java如何创建主线程
我是Java技术的新手。我知道Thread
在Java中只有两种创建方式
- 扩展线程类
- 实施可运行接口
因此,这只是两种创建方法Thread
。但是,当我们使用主JVM启动程序时,它启动了一个main
Thread
。我认为甚至JVM也必须遵循创建主要Thread
方法的规则,以创建主线程JVM必须扩展Thread类或实现Runnable
。
public class MainThreadExample { public static void main(String[] args) {
Thread t=Thread.currentThread();
System.out.println(t.getName());
}
}
我尽了最大的努力,但是不知道JVM是如何创建这个主要对象的。当我完全遍历主类(sun.tool.jar
)时,我知道这是负责主线程的类。但是在Google中搜索了如此多的网页后,无法找到它。因此,请提供帮助,如有可能,请同时参考示例或链接。
PS:我正在学习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 thread
3192 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_storage
3195 // Note: on solaris initialize_thread_local_storage() will (indirectly)
3196 // change the stack size recorded here to one based on the java thread
3197 // stacksize. This adjusted size is what is used to figure the placement
3198 // 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 has
3345 // 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(ThreadGroup
group,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)可能也会执行类似的操作。
以上是 Java如何创建主线程 的全部内容, 来源链接: utcz.com/qa/429981.html