`
xieyj
  • 浏览: 99915 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java线程启动代码

阅读更多

      上次写了个《Thread的调用》过于简单,在这以javaThread的启动过程做一个详细分析。

      先从java/lang/Thread.java看起

       public synchronized void start() {

              .....

              start0(); //   start0为本地方法 private native void start0();

              .....

       }

      

       上面start0的具体实现是jvm.cpp中的JVM_StartThread。

       ......

       native_thread = new JavaThread(&thread_entry, sz);

       if (native_thread->osthread() != NULL) {
              native_thread->prepare(jthread);
       }

       .....

       Thread::start(native_thread);

       

       上面传入函数指针thread_entry,thread_entry就是调用Thread.java中的run方法,这就是java程序中只需要new Thread().start,虚拟机就调用run方法的原因。

       static void thread_entry(JavaThread* thread, TRAPS) {
                        HandleMark hm(THREAD);
                        Handle obj(THREAD, thread->threadObj());
                        JavaValue result(T_VOID);
                        JavaCalls::call_virtual(&result,
                                      obj,
                                      KlassHandle(THREAD, SystemDictionary::thread_klass()),
                                      vmSymbolHandles::run_method_name(), //调用用户编写thread类run方法
                                      vmSymbolHandles::void_method_signature(),
                                      THREAD);
        }

        再看new JavaThread(...)这步。

        JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : Thread() {

                 .........

                 os::ThreadType thr_type = os::java_thread;
                 thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
                                                     os::java_thread;
                 os::create_thread(this, thr_type, stack_sz);

        }
        到了os::create_thread这步。

        bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {

               OSThread* osthread = new OSThread(NULL, NULL);

               thread->set_osthread(osthread);

               HANDLE thread_handle =
               (HANDLE)_beginthreadex(NULL,
                           (unsigned)stack_size,
                           (unsigned (__stdcall *)(void*)) java_start,
                           thread,
                           CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
                           &thread_id);

               //上面创建线程的时候,线程不自动运行,而是堵塞,直到上面的Thread::start(native_thread)才开始运行

               .............
        }

        再看启动函数java_start。

        static unsigned __stdcall java_start(Thread* thread) {

                   __try {
                          thread->run();  //注意:传入的是javaThread,所以在这调用javaThread::run
                   } __except(topLevelExceptionFilter(
                       (_EXCEPTION_POINTERS*)_exception_info())) {
                   }

        }

        查看

        void JavaThread::run() {

                  .......

                  thread_main_inner();//在里面真正调用用户写的java类run方法

        }

        void JavaThread::thread_main_inner() {

                 this->entry_point()(this, this); //调用传入thread_entry

                 //退出

                 this->exit(false);
                 delete this;

        }

        最后看一下

        void Thread::start(Thread* thread) {

                ........

                os::start_thread(thread); //运行创建时堵塞的线程

        }

       void os::start_thread(Thread* thread) {

                .........

                OSThread* osthread = thread->osthread();
                osthread->set_state(RUNNABLE);
                pd_start_thread(thread);

       }

       void os::pd_start_thread(Thread* thread) {

               //真正恢复操作系统线程运行的代码

               DWORD ret = ResumeThread(thread->osthread()->thread_handle());

       }

       由上面可以看到每个继承java.lang.Thread的类,调用start之后,都和一个操作系统的线程进行绑定。

1
0
分享到:
评论

相关推荐

    java线程文档

    多任务:同一时刻运行多个程序的能力。...每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。

    Java线程详解.ppt

    根据定义,进程为一个数据结构及能在其上进行的一次操作, 它有两个基本特征, ...程序启动运行时,就自动产生了一个线程,main方法就是在这个线程上运行的,当不再产生新的线程时,程序就是单线程。

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    java应用程序中使用线程

    3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...

    Java多线程贪吃蛇-snake完整源代码.rar

    Java多线程贪吃蛇-snake完整源代码,任何情况下处理的按键,按键导致重新启动游戏,  // 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半  int initArrayLength = maxX > 20 ? 10 : maxX / 2; ...

    Thread实现多线程

    继承Thread类: 1必须重写run 方法:里面放置的实际的线程体 2 启动线程: 3创建Thread对象 4调用Thread对象的start 方法启动线程

    Java 线程状态、线程池

    同步代码需要获取对应的锁对象,如果锁对象被其他线程持有,则当前线程就会进入一个block状态,当当前线程持有锁对象时,进入RUNNABLE状态 WAITING(无线等待) 通过一个wait方法线程进入一个无线等待状态,需要另一...

    java多线程URL方式下载单个大文件

    Java代码,根据URL方式下载单个文件或者图片,根据文件大小进行分批启动多线程下载!

    JAVA多线程运用

    (2)、创建三个线程,调用start()方法启动这三个线程 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 2. 实现3个类:Storage、Counter和Printer。 Storage类应存储整数。 Counter应创建线程,线程从0...

    java多线程

    2. 编写一个包含主方法main的公共类(访问权限为public的类),在主方法main中,使用第1步中编写的类创建一个对象,使用这个对象调用线程“张工”,“王工”和“老板”,并启动线程(start)。 第二部分 线程联合 ...

    Java Socket实例(服务器多线程)

    Java Socket实例(服务器多线程) 之前3积分下的代码,代码不错就是太贵,现本人分享出来

    Java多线程机制和线程之间的协作

    程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了程序从加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。 线程是比进程更小的执行单位...

    多线程笔记多线程笔记

    使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个...

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...

    MultithreadingJava:来自Cave of Programming http的John Purcell的Java多线程课程代码

    1- Java 多线程:启动线程 2- Java 多线程:Volatile – 基本线程通信 3- Java 多线程:同步 4- Java 多线程:锁定对象 5- Java 多线程:线程池 6- Java 多线程:倒计时锁存器 7- Java 多线程:生产者-消费者 8- ...

    java代码-3线程输出26个英文

    java代码-3线程输出26个英文

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java线程池使用后到底要关闭吗

    主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

Global site tag (gtag.js) - Google Analytics