Java线程的创建
来源:互联网 发布:k8陀螺仪软件下载 编辑:程序博客网 时间:2024/05/21 09:08
昨天看了《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创建一个线程!
- java线程的创建
- Java线程的创建
- Java线程的创建
- java线程的创建
- Java 线程的创建
- java线程的创建
- JAVA线程的创建与启动线程
- Java中的线程:线程的创建
- Java 线程的创建方法
- Java中线程的创建
- Java基础---线程的创建
- Java 创建线程的方法
- java中线程的创建
- java中线程的创建
- java线程的创建总结
- java 线程创建的方法
- 【多线程】Java线程的创建
- Java线程的创建方式
- Android4.2模拟器kernel下载及编译-linux kernel3.4.0
- iOS 7用户界面过渡指南 更新UI
- CART分类算法
- 学习笔记:C#修改电脑密码方法如下
- HDU 4614 线段树+二分
- Java线程的创建
- android edittext切换数字键盘
- Objective-C学习笔记(一)–类
- oracle的profiles
- python处理时间--- datetime模块
- ubuntu命令备忘
- iOS学习系列 - 扩展机制category与associative
- MFC,C++ 截屏
- 1015_sql优化(delete)