昨天看了《CLR via C#》的第五部分——线程的处理,其中多处提到:创建一个线程的代价是非常昂贵的。但学习JAVA的时候并没有见到过类似的概念,只知道创建一个线程比创建一个进程代价小得多。于是有了两个疑问:
- 为什么创建线程的代价是昂贵的?
- Java的线程是如何创建的,是直接调用OS的API,还是有自己的“抽象线程”?
仔细思考,这个问题应该相对的看,线程的创建最终还是要分配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创建一个线程!
本文链接:https://my.lmcjl.com/post/3419.html
展开阅读全文
4 评论