深入理解Thread构造函数

public class Test {
    public static void main(String[] args){
        ThreadConstruction.test();
    }
}

/*
    第二章 深入理解Thread构造函数

    Thread(String name);
    Thread(Runnable target);
    Thread(Runnable target, String name);


    Thread(ThreadGroup group, String name);
    Thread(ThreadGroup group, Runnable target);
    Thread(ThreadGroup group, Runnable target, String name);

    Thread();
    Thread(ThreadGroup group, Runnable target, String name, long stackSize);

 */

/*
    2.3 Thread和ThreadGroup

    要点:
        1.main线程所在的ThreadGroup称为main
        2.构造一个线程时,如果没有指定ThreadGroup,则会与其父线程使用同一个group
 */
class ThreadConstruction{
    public static void test(){

        ThreadGroup group = new ThreadGroup("TestGroup");

        Thread t1 = new Thread("t1");
        Thread t2 = new Thread(group,"t2");

        ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup();

        System.out.println("main's Group:"+mainThreadGroup.getName());
        System.out.println("t2's Group"+t2.getThreadGroup().getName());
//        System.out.println("main's == t1's? "+(t2.getThreadGroup()==mainThreadGroup));
    }
}

/*
    2.5.1 Thread与Stacksize

    要点:
        xss设置虚拟栈空间。虚拟栈空间越大,代表着线程内方法调用递归的深度就越深,
        虚拟栈空间越小,则代表着创建的线程数量越多。

    2.5.2 JVM内存结构

    JVM内存结构包括:程序计数器、Java虚拟机栈、本地方法栈、堆内存、方法区、
    Java8元空间

        程序计数器:
            无论任何语言,其实最终都需要由操作系统通过控制总线向CPU发送机器指令(其他语言的
            程序计数器貌似都搁在cpu内的寄存器里的哦)。Java也不例外,程序技术器在JVM中所起
            的作用就是用于存放当前线程接下来将要执行的字节码指令、分支、循环、跳转、异常等处
            理信息。在任何时候,一个处理器只执行其中一个线程中的指令,为了能够在CPU时间片轮
            转切换上下文之后顺利回到正确的执行位置、每条线程都需要具有一个独立的程序计数器,
            各个线程之间互不影响,因此JVM将此块内存区域设置为线程私有的。

        Java虚拟机栈:
            Java虚拟机栈也是线程私有的,它的生命周期与线程相同,是在JVM运行时所创建的。在
            线程中,方法执行的时候就会常见一个名为栈帧的数据结构,主要用于存放局部变量表、
            操作栈、动态连接、方法出口等信息。

                ==================================================
                = 局部变量表 == 操作栈 == 动态链接 == 方法出口 == 其他 =
                ==================================================

            每个线程创建的时候,JVM都会为其创建对应的虚拟机栈,方法的调用是栈帧被压入和弹出
            的过程。同样的虚拟机栈,如果局部变量表等占用内存越小则可以被压入的栈帧就越多,反
            之则可以被压入的栈帧就会越少,一般将栈帧内存的大小称为宽度,而栈帧的数量称为虚拟
            机栈的深度。

        本地方法栈:
            网络通信、文件操作的底层、甚至String的intern等都是JNI方法,JVM为本地方法所划分
            的内存区域便是本地方法栈。

        堆内存:
            堆内存被所有的线程共享,Java在运行期间所创建的所有对象几乎都存放在该内存区域,该
            内存区域也是垃圾回收器重点照顾的区域,因此有些时候堆内存被称为“GC堆”。堆内存一般
            分为新生代和老年代,更细致的划分为Eden区、From Survivor区、和To Survivor区

                ===============================================
                =                   Survivor                  =
                =                                             =
                =    ======   ======   ======   ===========   =
                =    =Eden=   = S0 =   = S1 =   = Tenured =   =
                =    =    =   =    =   =    =   =         =   =
                =    ======   ======   ======   ===========   =
                =                                             =
                ===============================================

        方法区:
            方法区被所有线程所共享,它主要用于存储已经被虚拟机加载的类信息、常量、静态变量、即
            时编译器编译后的代码等数据,

        Java8元空间
            JDK1.8起,持久代内存被彻底删除,取而代之的是元空间。
 */

——《Java高并发编程详解》笔记

猜你喜欢

转载自www.cnblogs.com/junjie2019/p/10584659.html