Java中原始线程场景下,新Thread对象能否与当前运行线程相等?
关于Thread构造函数中
parent == this的疑问 我在研究Executor Service的内部实现时,看到Thread类的如下构造函数代码:
Thread(ThreadGroup g, String name, int characteristics, Runnable task, long stackSize, AccessControlContext acc) { Thread parent = currentThread(); boolean attached = (parent == this); // primordial or JNI attached }
我的疑问是:当前运行线程为何会与新创建的Thread实例相等?(此问题针对原始线程场景)
解答
这段代码里的parent == this是用来识别两种特殊线程场景:
原始线程(primordial thread):JVM启动时会创建第一个核心线程(比如执行main方法的主线程),这个线程的Java层Thread对象是由JVM内部直接构造的,并非通过Java代码
new Thread()创建。当这个Thread实例的构造函数被调用时,JVM已经让该线程处于运行状态,此时currentThread()返回的就是正在执行构造函数的这个Thread实例本身,也就是this,因此parent == this会成立。JNI附加的线程:当通过JNI的
AttachCurrentThread方法将原生操作系统线程关联到JVM时,JVM会为该线程创建对应的Java Thread对象。此时构造这个Thread对象的代码正是在该原生线程中执行的,currentThread()自然指向刚创建的这个Thread实例,也会出现parent == this的情况。
简言之,这两种场景下,Thread对象的构造过程是在它自己对应的线程中执行的,而非由其他线程创建,所以当前运行线程就是这个新创建的Thread实例本身。
内容的提问来源于stack exchange,提问作者Jahnvi Tanwar
相关产品推荐
相关产品推荐

