学习高并发编程2
1.线程的父子关系
每一个线程的创建都是由另一个线程的完成,创建线程的线程就是父线程。
2.Thread与ThreadGroup
main函数所在的线程由JVM创建,也就是main线程,在main方法里创建的线程都是其子线程,main线程所在的Thread Group称为main,而其子线程如果未指定则默认和父线程为同一个ThreadGroup
3.Thread与JVM虚拟机栈
JVM虚拟机内存大致可以分为5大部分。程序计数器,虚拟机栈,本地方法栈,堆内存,本地方法区。其中,程序计数器,虚拟机栈,本地方法栈属于线程私有;堆内存与本地方法区属于线程共享。
由于JVM虚拟机内存大小是不变的,所以可以粗略的认为JVM内存 = 堆内存 + 线程数量 * 栈内存。堆内存不变,栈内存越大,创建线程的数量越少。由于栈内存是线程私有的,所以每个栈内存都会占有指定内存大小。同样,堆内存越大,线程数量也越少。
4.守护线程
守护线程一般用于处理一些后台的工作,如垃圾回收线程。守护线程,专门用于服务其他的线程,如果其他的线程都执行完毕,连main线程也执行完毕,那么jvm就会退出。用代码解释:
public class DaemonThread {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
try {
System.out.println("用户线程正在进行中");
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//thread.setDaemon(true);
thread.start();
Thread.sleep(2_000L);
System.out.println("主线程结束生命周期--------------");
}
}
运行结果:
...
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
主线程结束生命周期--------------
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
...
根据结果显示,此时主线程(main线程)已经结束,但JVM虚拟机并没有结束,因为此时还有我们自己写的一个线程并没有结束,但如果将我们自己写的线程设为守护线程:
public class DaemonThread {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
try {
System.out.println("用户线程正在进行中");
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.setDaemon(true);
thread.start();
Thread.sleep(2_000L);
System.out.println("主线程结束生命周期--------------");
}
}
运行结果:
...
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
用户线程正在进行中
主线程结束生命周期--------------
Process finished with exit code 0
由于将我们自己的线程设为守护线程,所以当主线程结束,JVM虚拟机就会自动退出。
以上内容为个人学习总结心得,如有不妥欢迎指正。