0
点赞
收藏
分享

微信扫一扫

JAVA系列:Thread.start()是否可多次调用

鱼满舱 2022-03-12 阅读 2




答案是:java.lang.IllegalThreadStateException 



线程启动start()源码

JAVA系列:Thread.start()是否可多次调用_创建线程


start0()这个方法是在Thread 的静态块中来注册的,代码如下JAVA系列:Thread.start()是否可多次调用_java_02

JAVA系列:Thread.start()是否可多次调用_创建线程_03

registerNatives 的 本 地 方 法 的 定 义 在 文 件Thread.c,Thread.c 定义了各个操作系统平台要用的关于线程的公共数据和操作,以下是 Thread.c 的全部内容http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/00cd9dc3c2b5/src/share/native/java/lang/Thread.c

JAVA系列:Thread.start()是否可多次调用_创建线程_04

从 这 段 代 码 可 以 看 出 , start0() , 实 际 会 执 行JVM_StartThread 方法,这个方法是干嘛的呢?我们找到 jvm.cpp 这个文件;这个文件需要下载 hotspot 的源码才能找到.

JAVA系列:Thread.start()是否可多次调用_创建线程_05

VM_ENTRY 是用来定义 JVM_StartThread 函数的,在这个函数里面创建了一个真正和平台有关的本地线程.

继续寻找 JavaThread 的定义在 hotspot 的源码中 thread.cpp 文件中 1558 行的位置可以找到如下代码

JAVA系列:Thread.start()是否可多次调用_java_06

这个方法有两个参数,第一个是函数名称,线程创建成功之后会根据这个函数名称调用对应的函数;第二个是当前进程内已经有的线程数量。最后我们重点关注与一下os::create_thread,实际就是调用平台创建线程的方法来创建线程。

接下来就是线程的启动,会调用 Thread.cpp 文件中的Thread::start(Thread* thread)方法,代码如下

JAVA系列:Thread.start()是否可多次调用_创建线程_07

start 方法中有一个函数调用: os::start_thread(thread);,调用平台启动线程的方法,最终会调用 Thread.cpp 文件中的 JavaThread::run()方法


greop.add(this)

greop.add(this),把当前线程添加进线程组,源码如下:

JAVA系列:Thread.start()是否可多次调用_java_08


group.threadStartFailed(this)

启动失败后调用group.threadStartFailed(this),都是加锁方法,从线程组中移除当前线程,源码如下

JAVA系列:Thread.start()是否可多次调用_java_09


举报

相关推荐

0 条评论