如何用Java创建主线程

Aru*_*run 14 java

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

  • 扩展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());            
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了最好的水平,但不知道JVM是如何创建这个主要对象的.当我完全通过主类(sun.tool.jar)时,我知道这是负责主线程的类.但是在搜索了如此多的Google网页后无法得到它.所以请帮助,如果可能的话,请参考我的示例或链接.

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

Jon*_*oni 18

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

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

在Hotspot JVM中,Threadssrc/share/vm/runtime/thread.hpp和中定义的类中有很多与线程相关的代码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();
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

换句话说,我们把它初始化System,ThreadGroupThread类,然后创建的实例Thread通过参考thread_object(线3342),并且将Thread实例为主要JavaThread.

如果你想知道它做了什么create_initial_thread,显然它分配了Thread实例,在Thread实例JavaThread的私有eetop字段中存储了一个指向(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 }
Run Code Online (Sandbox Code Playgroud)

现在,这就是Hotspot VM的功能.其他实现,如IBM J9,Oracle JRockit或Azul Zing可能会做类似的事情.