首页 文章

如何用Java创建主线程

提问于
浏览
14

我是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 回答

  • 18

    我相信确切的机制是特定于JVM的 . 规格有点模糊,但Thread Javadoc提供以下内容:

    当Java虚拟机启动时,通常会有一个非守护程序线程(通常调用某个指定类的名为main的方法) .

    如何映射到 Thread 类的实例似乎没有指定 .

  • 3

    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_object 引用的 Thread 实例(第3342行),并为主 JavaThread 设置 Thread 实例 .

    如果你想知道 create_initial_thread 做了什么,显然它分配Thread实例,在Thread实例的私有 eetop 字段中存储指向 JavaThread (C)对象的指针,将线程优先级字段设置为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可能会做类似的事情 .

相关问题