如何用Java创建主线程

时间:2013-07-02 18:19:55

标签: java

我是Java技术的新手。我知道在Java中只有两种方法可以创建Thread

  • 扩展Thread类
  • 实施Runnable接口

所以这只是创建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搜索了这么多网页之后无法得到它。所以请帮助,如果可能的话,请参考我的示例或链接。

P.S:我正在学习Java技术,我不应该为他们如何创建主要技术而烦恼,所有这些都是设计的东西。但我认为这是一个合乎逻辑的问题

2 个答案:

答案 0 :(得分:18)

java.lang.Thread的实例不是线程;它可以用来表示JVM中的执行线程,但是JVM完全能够在不使用Thread类的情况下创建线程。

这是主线程发生的事情:JVM创建它,并创建java.lang.Thread的实例以便稍后表示它。

在Hotspot JVM中,src/share/vm/runtime/thread.hppsrc/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);

换句话说,我们初始化SystemThreadGroupThread类,然后创建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类的实例的方式似乎没有被指定。