我是Java技术的新手。我知道在Java中只有两种方法可以创建Thread
所以这只是创建Thread
的两种方式。但是当我们使用主JVM启动我们的程序时,启动了一个主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搜索了这么多网页之后无法得到它。所以请帮助,如果可能的话,请参考我的示例或链接。
答案 0 :(得分:18)
java.lang.Thread
的实例不是线程;它可以用来表示JVM中的执行线程,但是JVM完全能够在不使用Thread
类的情况下创建线程。
这是主线程发生的事情:JVM创建它,并创建java.lang.Thread
的实例以便稍后表示它。
在Hotspot JVM中,src/share/vm/runtime/thread.hpp
和src/share/vm/runtime/thread.cpp
中定义的Threads
类中有许多与线程相关的代码。 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
的{{1}}实例。
如果你想知道JavaThread
做了什么,显然它分配了Thread实例,在Thread实例的私有create_initial_thread
字段中存储了指向JavaThread
(C ++)对象的指针,将线程优先级字段设置为normal,调用eetop
构造函数,并返回实例:
Thread(ThreadGroup group,String name)
现在,这就是Hotspot VM的功能。其他实现,如IBM J9,Oracle JRockit或Azul Zing可能会做类似的事情。
答案 1 :(得分:3)
我相信确切的机制是特定于JVM的。规范有点模糊,但Thread
Javadoc提供了以下内容:
当Java虚拟机启动时,通常会有一个非守护程序线程(通常调用某个指定类的名为
main
的方法)。
这个映射到Thread
类的实例的方式似乎没有被指定。