昨天看了《CLR via C#》的第五部分——线程的处理,其中多处提到:创建一个线程的代价是非常昂贵的。但学习JAVA的时候并没有见到过类似的概念,只知道创建一个线程比创建一个进程代价小得多。于是有了两个疑问:
public synchronized void start()
{
...
start0();
...
}
private native void start0();
start0()调用了本地方法,需要查看本地方法的实现。本地方法的源码可以到oracle网站去下载,网上找的这个地址 http://download.java.net/jdk6/source/ 。这个网址现在重定向到OpenJDK了。
static JNINativeMethod methods[] =
{
{"start0", "()V", (void *)&JVM_StartThread},
..
}
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
JavaThread *native_thread = NULL;
...
native_thread = new JavaThread(&thread_entry, sz);
...
Thread::start(native_thread);
JVM_END
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : ...
{
...
os::create_thread(this, thr_type, stack_sz);
}
void Thread::start(Thread* thread)
{
...
os::start_thread(thread);
}
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size)
{
...
int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
...
}
pthread_create,POSIX中的API,呵呵。