六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1221|回复: 0

Thread的调用

[复制链接]

升级  10.67%

18

主题

18

主题

18

主题

秀才

Rank: 2

积分
66
 楼主| 发表于 2013-2-7 10:05:04 | 显示全部楼层 |阅读模式
    在java里面创建线程new Thread().start(),在这里面先调用Thread.java的init()进行了初始化,然后调用了本地方法 start0(),这个方法实际上调用了hotspot\src\share\vm\prims\jvm.cpp文件里的JVM_StartThread方法。 在上面方法里new JavaThread(),这是jvm里面区分的线程类型。创建时候传进入一个函数指针thread_entry,这个函数将调用 用户实现的run()方法。在JVM_StartThread()最后通过Thread::start(native_thread)启动一个系统线程来执行用户创建的方法。 系统线程首先执行的是JavaThread里面的run方法,run方法进行一系列初始化后,调用thread_main_inner,这个就调用了上面传入 的thread_entry,真正的用户run方法由此开始执行。thread_main_inner最后执行退出及delete this ,删除JavaThread数据结构。
    在这一连串调用中,用到了一些技巧。通过os::create_thread(this, thr_type, stack_sz)将启动线程的系统调用和javaThread联系起来。  就象下面的做法
      class Thread{
              public:
                      Thread();
                      ~Thread();
                      void start();
                      virtual void run() = 0 ;
              private:
                       HANDLE thread_handle ;
       };
       class CommThread:public Thread{
             public:
                    CommThread(){}
                    ~CommThread(){}
                    virtual void run();
       };
   通过继承Thread类,就把一个线程变成个线程对象,更好体现了面向对象的编程思想。
      Thread的实现
      Thread::Thread(){
               unsigned thread_id;
               thread_handle =
                          (HANDLE)_beginthreadex(NULL,
                                                                   NULL,
                                                                   (unsigned (__stdcall *)(void*)) th_start,
                                                                   this,
                                                                   CREATE_SUSPENDED ,
                                                                   &thread_id);
      }
      Thread::~Thread(){
      }
      void Thread::start(){
                ResumeThread(thread_handle);
      }
   思路还是比较简单,在创建对象时候即开始一个堵塞线程,直到调用start时候才开始运行它。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表