Java如何创建主线程

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

  • 扩展线程类
  • 实施可运行接口

因此,这只是两种创建方法Thread。但是,当我们使用主JVM启动程序时,它启动了一个main

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中搜索了如此多的网页后,无法找到它。因此,请提供帮助,如有可能,请同时参考示例或链接。

PS:我正在学习Java技术,我不应该为他们如何创建主要语言而烦恼,这全是设计问题。但我认为这是一个合乎逻辑的问题

回答:

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

这就是主线程发生的情况:JVM创建了它,并创建了一个实例java.lang.Thread来表示它。

在Hotspot JVM

Threads中,src/share/vm/runtime/thread.hppand中定义的类中有很多与线程相关的代码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();

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用于主实例JavaThread

如果您想知道它的create_initial_thread作用,那么显然它会分配Thread实例,将指向JavaThread(C

++)对象的指针存储在Thread实例的私有eetop字段中,将线程优先级字段设置为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)可能也会执行类似的操作。

以上是 Java如何创建主线程 的全部内容, 来源链接: utcz.com/qa/429981.html

回到顶部