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 JVMThreads中,src/share/vm/runtime/thread.hppand中定义类中有很多与线程相关的代码src/share/vm/runtime/thread.cppJVM的启动将调用静态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实例的privateeetop字段中,将线程优先级字段设置为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)可能也会执行类似的操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从Java中的工作线程访问主线程?

来自分类Dev

如何在主线程外创建QtQuick窗口

来自分类Dev

如何在主线程外创建QtQuick窗口

来自分类Dev

如何在工作线程中重用由主线程创建的OMP线程池?

来自分类Dev

如何限制创建的线程数并等待主线程直到任一线程找到答案?

来自分类Dev

如何在pthread_create创建的子线程中调用主线程?

来自分类Dev

如何阻止主线程退出?

来自分类Dev

如何从主线程唤醒睡眠线程?

来自分类Dev

如何唤醒睡眠线程并退出主线程?

来自分类Dev

Java线程:start()-如何创建新线程?

来自分类Dev

Java:如何在独立于主线程的命令窗口中打开新线程的执行?

来自分类Dev

Java仅用于2台计算机的多线程,如何在主线程中执行

来自分类Dev

Java仅用于2台计算机的多线程,如何在主线程中执行

来自分类Dev

如何在QThread上创建QTcpServer,然后从主线程停止它

来自分类Dev

捕获由主线程中的工作线程创建的异常

来自分类Dev

新线程无法识别已经创建的主线程单例

来自分类Dev

在单独的线程中创建 PDF 仍然使主线程无响应

来自分类Dev

QtConcurrent :: run如何结束主线程?

来自分类Dev

如何在主线程上调用getLooper()?

来自分类Dev

即使主线程结束,如何显示框架

来自分类Dev

如何确定什么阻塞了主线程

来自分类Dev

如何访问在主线程中定义的变量?

来自分类Dev

如何不从主线程更新textview?

来自分类Dev

如何让 KeyListener 使用主线程而不是 EDT?

来自分类Dev

如何从任务在主线程上运行语句

来自分类Dev

当主线程在Python中继续执行时,如何从主线程中生成子线程

来自分类Dev

Java:多线程访问主线程变量/方法

来自分类Dev

无线程阻塞的主线程回调(Java)

来自分类Dev

在退出函数之前,如何限制创建的最大线程数并等待主线程直到任一线程找到答案?

Related 相关文章

  1. 1

    如何从Java中的工作线程访问主线程?

  2. 2

    如何在主线程外创建QtQuick窗口

  3. 3

    如何在主线程外创建QtQuick窗口

  4. 4

    如何在工作线程中重用由主线程创建的OMP线程池?

  5. 5

    如何限制创建的线程数并等待主线程直到任一线程找到答案?

  6. 6

    如何在pthread_create创建的子线程中调用主线程?

  7. 7

    如何阻止主线程退出?

  8. 8

    如何从主线程唤醒睡眠线程?

  9. 9

    如何唤醒睡眠线程并退出主线程?

  10. 10

    Java线程:start()-如何创建新线程?

  11. 11

    Java:如何在独立于主线程的命令窗口中打开新线程的执行?

  12. 12

    Java仅用于2台计算机的多线程,如何在主线程中执行

  13. 13

    Java仅用于2台计算机的多线程,如何在主线程中执行

  14. 14

    如何在QThread上创建QTcpServer,然后从主线程停止它

  15. 15

    捕获由主线程中的工作线程创建的异常

  16. 16

    新线程无法识别已经创建的主线程单例

  17. 17

    在单独的线程中创建 PDF 仍然使主线程无响应

  18. 18

    QtConcurrent :: run如何结束主线程?

  19. 19

    如何在主线程上调用getLooper()?

  20. 20

    即使主线程结束,如何显示框架

  21. 21

    如何确定什么阻塞了主线程

  22. 22

    如何访问在主线程中定义的变量?

  23. 23

    如何不从主线程更新textview?

  24. 24

    如何让 KeyListener 使用主线程而不是 EDT?

  25. 25

    如何从任务在主线程上运行语句

  26. 26

    当主线程在Python中继续执行时,如何从主线程中生成子线程

  27. 27

    Java:多线程访问主线程变量/方法

  28. 28

    无线程阻塞的主线程回调(Java)

  29. 29

    在退出函数之前,如何限制创建的最大线程数并等待主线程直到任一线程找到答案?

热门标签

归档