多线程学习笔记四-jvm结构(stackSize的大小)

构造函数Thread()
start()->native start0()->run()
1.创建线程对象thread,默认有一个线程名,以Thread-开头,从0开始技术
Thread-0
Thread-1
Thread-2
2.如果在构造thread的时候没有传递runnable或者没有重写thread的run方法,该thread将不会调用任何东西,如果传递了runnable接口的实例,或者重写了thread的run方法,则会执行该方法的逻辑单元
3.如果构造线程对象未传入ThreadGroup,Thread会默认获取父线程的ThreadGroup作为该线程的ThreadGroup,此时子线程和父线程将会在同一个ThreadGrouop

多线程与jvm内存结构的关系,虚拟机栈实验
jvm结构
方法区(共享的区域,类加载的信息,常量,变量,静态变量,属于线程栈的一部分)
本地方法区(natvie方法)
程序计数器(指令交给cpu运行)
虚拟机栈(每个线程私有)栈帧
每个线程都有自己的虚拟机栈,main线程也有
栈帧:局部变量表
操作栈
动态连接 方法入口的地址。出口的地址
方法出口

堆内存

main线程测试栈帧
package com.picc.concerrent.chapter3;

public class CreateThread3 {
private static int count;
public static void main(String[] args) {
try {
add(0);
} catch (Error e) {
e.printStackTrace();
System.out.println(count);
}

}
public static void add(int i){
++count;
add(i+1);
}
}
多线程学习笔记四-jvm结构(stackSize的大小)

自定义测试栈帧
可以在构造thread线程的时候设置stacksize的大小(1<<24)
package com.picc.concerrent.chapter3;

import java.security.PrivateKey;

public class CreateThread4 {
private static int count;
public static void main(String[] args) {
Thread thread = new Thread(null, new Runnable() {
@Override
public void run() {
try {
add(0);
} catch (Error e) {
e.printStackTrace();
System.out.println(count);
}
}
private void add(int i){
++count;
add(i+1);
}
},“test”,1<<24);
thread.start();
}
}
多线程学习笔记四-jvm结构(stackSize的大小)

总结:构造thread的时候传入stacksize代表着该线程占用的stack大小,如果没有指定stacksize的大小,默认是0,0代表着忽略该参数。