有人说java无法创建线程,只能创建任务,线程是有操作系统创建的,这怎么理解?

有人理解run方法只是提供要执行的方法,就像寄快递时发件人将快递打包,由系统创建线程来执行方法,就像由快递公司负责运送,可以这么理解吗?求大神指点迷津
关注者
2
被浏览
805
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

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()中最后一行调用了

看一下这个方法的实现

这里主要是进行一些线程状态的设置.