在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时候才开始运行它。