Java线程的创建

11 篇文章 1 订阅

昨天看了《CLR via C#》的第五部分——线程的处理,其中多处提到:创建一个线程的代价是非常昂贵的。但学习JAVA的时候并没有见到过类似的概念,只知道创建一个线程比创建一个进程代价小得多。于是有了两个疑问:

  1.  为什么创建线程的代价是昂贵的?
  2.  Java的线程是如何创建的,是直接调用OS的API,还是有自己的“抽象线程”?

问题1:
仔细思考,这个问题应该相对的看,线程的创建最终还是要分配CPU和内存资源,并且多线程运行时还有会有上下文的切换,相对与执行一个线程代价自然昂贵。但有的问题必须使用多线程(进程)去解决(或者说多线程解决会更好),而相对于创建一个进程,线程的代价会更小。

问题2:
这个还是看一下JDK的源码吧
先看java.lang.Thread.java中的start()方法:
public synchronized void start()
{
    ...
    start0();
    ...
}

private native void start0();
start0()调用了本地方法,需要查看本地方法的实现。本地方法的源码可以到oracle网站去下载,网上找的这个地址 http://download.java.net/jdk6/source/ 。这个网址现在重定向到OpenJDK了。

解压后找到jdk\src\share\native\java\lang\Thread.c并查看,方法start0()映射到了JVM_StartThread这个方法中:
static JNINativeMethod methods[] = 
{
    {"start0",           "()V",        (void *)&JVM_StartThread},
    ..
}

在hotspot\src\share\vm\prims\jvm.cpp查看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

在hotspot\src\share\vm\runtime\thread.cpp中查看JavaThread的实现:
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);
}

在hotspot\src\os目录下可以看到windows, linux, solaris和posix的实现,先检查linux\vm\os_linux.cpp
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,呵呵。
所以问题2也有答案了: 通过调用平台的API创建一个线程!


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值