一、JUC-基础线程知识
精选
原创
哇咔咔嗒
2023-05-24 15:29:54
博主文章分类:JUC
©著作权
文章标签
用户线程
守护线程
java
文章分类
Java
后端开发
©著作权归作者所有:来自51CTO博客作者哇咔咔嗒的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、Thread
代码示例:
public static void main(String[] args) {
Thread t1 = new Thread(()->{
},"t1");
// private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
t1.start();;
}
解析:
1、java线程是通过start方法启动的,主要内容在native方法的start0中
2、openjdk的写JNI(java本地接口)一般是一一对应的,Thread.java对应的就是Thread.c
3、start0其实就是JVM_StartStartThread。此时看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。
源码路径
![1.png](https://s2.51cto.com/images/202305/97c75dd590b361c54aa576dcb597617f9fa2ca.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
thread.c文件路径
![3.png](https://s2.51cto.com/images/202305/765eef040329a3d2147480f4d73b8babe00f86.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
jvm.cpp文件路径
传一个本地的java线程
![5.png](https://s2.51cto.com/images/202305/86c1d097600808d71c58646f228ed1d220ec9f.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
thread.cpp
总结:本地的java线程传给start0,最终是由jvm配合操作系统,底层由操作系统来分配一个原生的线程
二、多线程相关概念
1、1把锁:synchronized
2、两个并
1、并发
是在同一个实体上的多个事件
是在一台处理器上“同时”处理多个任务
同一时刻,其实只有一个事件发生
秒杀
2、并行
是在不同实体上的多个事件
是在多台处理器上同时处理多个任务
同一时刻,大家都在做事情,你做你的,我做我的,但是我们都在做
泡方便面:一边烧热水,一边撕调料包
3、并发vs并行
![7.png](https://s2.51cto.com/images/202305/e1946ac9059de7464db0532e4e1ba82f63aa63.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3、三个程
1、进程
简单的说,在系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。
2、线程
被称为轻量级进程,在同一个进程内,会有一个或多个线程,是大多数操作系统进行时序调度的基本单元
3、管程
Monitor(监视器),也就是我们平时所说的锁
Monitor是一种同步机制,它的义务是保证同一时间内只有一个线程可以访问被保护的数据和代码
JVM中同步是基于进入和退出监视器对象来实现的,每个对象实例都会有一个Monitor对象。
Monitor对象和java对象一同创建并销毁,它的底层是由C++语言来实现的。
JVM第三版
执行线程要求先成功持有管程,然后才能执行方法,最后当方法完成时释放管程。在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程。
三、用户线程和守护线程
一般不做特别说明配置,默认都是用户线程
1、用户线程
是系统的工作线程,他会完成这个程序需要完成的业务操作
部门领导
2、守护线程
守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩守护线程的时候,java虚拟机会自动退出。
部门秘书
3、判断是用户线程还是守护线程的属性
daemon属性:true:守护线程 false:用户线程
![9.png](https://s2.51cto.com/images/202305/b3f0e67109ca24ad75a821aa3094b872538999.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4、例子演示
package com.lori.juc2023.juc1;
import java.util.concurrent.TimeUnit;
//守护线程陪伴用户线程,用户线程各自独立
public class ThreadBaseDemo {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
System.out.println(Thread.currentThread().getName()+"************开始运行"+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
while (true){
}
},"t1");
// private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
t1.start();;
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName()+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"+"*********end"));
}
}
![10.png](https://s2.51cto.com/images/202305/d4b066b547f248b0b73939ed423c99a06dda0b.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
package com.lori.juc2023.juc1;
import java.util.concurrent.TimeUnit;
//守护线程陪伴用户线程,用户线程各自独立
public class ThreadBaseDemo {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
System.out.println(Thread.currentThread().getName()+"************开始运行"+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
while (true){
}
},"t1");
// private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
t1.setDaemon(true);//设置t1为守护线程,当用户线程结束时,可以看出,守护线程也退出了。设置此属性必须再start之前,否则会报异常。
t1.start();;
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName()+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"+"*********end"));
}
}
![11.png](https://s2.51cto.com/images/202305/99648aa704e5dde55c076240dc9c3b3511c166.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
赞
收藏
评论
分享
举报
上一篇:二十五、JVM-分析 GC 日志(基础篇)
下一篇:二、JUC-CompletableFuture
|