新的 Thread 对象是否可能等于 Java 中当前正在运行的线程(在原始线程的上下文中)?

问题描述 投票:0回答:1

所以我正在研究Executor Service的内部工作,在线程的构造函数中提到了这些行:


    Thread(ThreadGroup g, String name, int characteristics, Runnable task,
           long stackSize, AccessControlContext acc) {

        Thread parent = currentThread();
        boolean attached = (parent == this);   // primordial or JNI attached

所以我的问题是,当前正在运行的线程怎么可能等于线程的新实例?

java multithreading executorservice
1个回答
0
投票

currentThread()
正在返回...当前正在执行的线程。

Thread
构造函数中,
this
将是正在构造的
Thread
object。 这通常不是“执行”线程。 您在此处创建的 Thread 通常会在调用
start()
时开始执行。
但是......这里有一些情况并非如此。

引导 JVM 时会发生一种情况。 引导涉及在所有 JVM 基础设施运行之前创建某些 Java 对象。 这些对象之一是原始线程的

Thread

对象;即正在执行引导的线程。 引导代码将执行以下操作:


创建一个 Java
    Thread
  • 对象而不运行其构造函数。 (它可以做到这一点:它是用本机代码实现的。)
    调整运行时数据结构,以便 
  • currentThread()
  • 返回
    Thread
    对象。
    使用适当的参数在 
  • Thread
  • 对象上调用该构造函数。
    
    
  • 如果您想浏览 OpenJDK 源代码树,您应该能够找到执行此操作的代码。

根据该评论,其他场景显然涉及 JNI。 我不确定,但当 C 或 C++ 应用程序调用

JNI_CreateJavaVM

时可能会发生这种情况。

    

© www.soinside.com 2019 - 2024. All rights reserved.