有人说java无法创建线程,只能创建任务,线程是有操作系统创建的,这怎么理解?
Java程序的调度都是依赖于JVM中的栈, 而栈的执行则是由线程进行的, 而这个线程其实就是操作系统的线程.
在Java中我们启动一个线程的话, 其实就是启动了一个操作系统的线程, 例如使用pthread开启一个线程. Java中或者说JVM并没有线程, 只有持有线程的线程对象.
这么说可能还是不太清晰, 从源码看一下.
当Java中的Thread类被加载进JVM之后, 会调用一个registerNatives()的一个本地方法.
这个方法是在jvm中实现的, 在Thread.c中实现了该方法
在methods这个数组中做了一个映射, 将java中线程的native方法与C的函数指针进行了关联.
调用Java中Thread的start()方法时, 其实就是调用的JVM_StartThread这个函数指针
看到没, 在jvm中,是直接创建了一个c++的JavaThread类型的native_thread对象, 紧接着就开始调用jvm中的Thread的start()函数.
在创建JavaThread的时候, 其内部又创建了一个OSThread
在OSThread中就利用pthread_create()创建出了一个线程. 在调用pthread_create()函数的时候, 下面俩个参数需要看一下
- java_start, 线程启动后的回调函数
- thread, 回调函数的参数
在java_start()函数先进行一些状态检查设置, 最后调用thread(JavaThread类型, pthread_create最后一个参数)的run()方法, 进行一些与Java线程相关的状态设置, 例如方法栈之类的(此时的处理就从系统线程那转移到了Java线程).
在thread_main_inner()方法中就开始调用刚开始传递的entry_point()函数了
此时就开始调用Java中的Thread的run()方法了.
回过头来刚开始 在JVM_StartThread()中最后一行调用了
看一下这个方法的实现
这里主要是进行一些线程状态的设置.