线程系列二:Thread构造函数
前言
在我们开始学线程的时候新建一个线程用的什么?new Thread()相信大家都很熟悉,不知道大家有没有深入理解过这个函数
一、new Thread
有一下几个知识点:
-
new Thread(“t1”) 可以传入一个参数作为线程的名字,如果没有会默以"Thread-"作为前缀递增
-
在线程是new状态时可以修改线程名字其他状态将不能修改
-
jvm启动时会创建一个main线程,我们自己所创建的线程是由这个主线程进行创建。
-
3中说明我们的线程是有主线程创建,所有的线程都在主线程组中岂不是会不好分类,所以有线程组的概念,我们可以指定一个ThreadGroup.如果没有指定默认的就是父线程的线程组
-
线程是运行在虚拟机栈上的,所以线程的运行是跟它有关系的
-
线程的分类:守护线程、非守护线程的区别
1 2 3 4作为知识点记忆即可,在源码中也很明显的看出来接下来着重看一下 5 6
二、与jVM
1.与内存的关系
内存分为程序计数器,虚拟机栈,本地方法栈,堆内存,方法区,java8元空间
- 程序计数器:其在JVM中所起到的作用就是用于存放当前线程接下来将要执行的信息。这个是属于 线程私有,因为为了能够在CPU时间片切换上下文能回到正确的位置执行,所以每个线程都需要一个独立的程序计数器。
- 虚拟机栈:与程序计数器类似他也是私有的。在线程中方法在执行的时候都会创建一个名为栈帧的数据结构。主要用于存放局部变量表 操作栈 动态链接方法出口等信息
- 本地方法栈:JVM中本地方法划分的内存区域同样也是私有的
- 堆内存:被所有线程共享存放的是java运行期间的的所有对象,常说的GC通常都是发生在这个地方
- 方法区:被所有线程共享存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
- java8元空间: 是在1.8之后提出这部分主要是替代了方法区中的持久内存,方法区在这之前被分为持久代和代码缓存区。所以同样他也是被所有线程共享
2.线程创建的数量
从1中不难看出线程的创建数量跟堆内存以及栈内存的大小有直接的关系
我们可以粗略的任务一个进程的内存大小为:堆内存+线程数量*栈内存
为什么要考虑这个问题呢?通常我们内存异常,高并发系统的承受能力的时候可以往这个方向考虑
三、守护线程
线程粗略的可以分为两种守护线程/非守护线程
这两个的主要区别在于:
- 守护线程的退出是如果没有非守护线程的时候就会自行退出,一般是用于我们的垃圾回收以及一些其他的后台的操作。
- 非守护线程的结束是由自己去控制,正常的结束自己的生命周期
使用以下代码就可以将自己的线程设置为一个非守护线程
thread.setDaemon(true);
以上通过阅读《JAVA高并发编程详解》汪文君著 所得的感悟
大家有兴趣也可以去了解一下