我是Java技术的新手 . 我知道在Java中只有两种方法可以创建 Thread
-
扩展Thread类
-
实现Runnable接口
所以这只是创建 Thread
的两种方式 . 但是当我们用主JVM启动我们的程序时,启动了一个主要的 Thread
. 我认为即使JVM必须遵循创建main 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网页之后无法得到它 . 所以请帮助,如果可能的话,请参考我的示例或链接 .
P.S:我正在学习Java技术,我不应该打扰他们如何创建主要技术,所有这些都是设计的东西 . 但我认为这是一个合乎逻辑的问题
2 回答
我相信确切的机制是特定于JVM的 . 规格有点模糊,但Thread Javadoc提供以下内容:
如何映射到
Thread
类的实例似乎没有指定 .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
函数,该函数已在操作系统设置的线程中运行 . 在该功能中,我们发现:JavaThread
课程显然用于簿记;它将OS或VM线程与Java Thread对象相关联 . Java对象显然还不存在 . 然后代码继续初始化各种其他东西,稍后仍然在相同的函数中我们发现:换句话说,我们初始化
System
,ThreadGroup
和Thread
类,然后创建thread_object
引用的Thread
实例(第3342行),并为主JavaThread
设置Thread
实例 .如果你想知道
create_initial_thread
做了什么,显然它分配Thread实例,在Thread实例的私有eetop
字段中存储指向JavaThread
(C)对象的指针,将线程优先级字段设置为normal,调用Thread(ThreadGroup group,String name)
构造函数,然后返回实例:现在,这就是Hotspot VM的功能 . 其他实现,如IBM J9,Oracle JRockit或Azul Zing可能会做类似的事情 .