线程基础知识复习
目录
并发相关Java包
并发始祖
- 并发始祖Doug Lea
start线程解读
-
初始程序 public static void main(String[] args) {
Thread t1 = new Thread(() ->{
},"t1");
t1.start();
}
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();
-
native 调用了本地方法,我们可以通过下载官网OpenJDK查看其源码
-
thread.c java线程是通过start的方法启动执行的,主要内容在native方法start0中 Openjdk的写JNI一般是一一对应的,Thread.java 对应的就是Thread.c start0 其实就是JVM_StartThread 。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/de16a11f0fb44c45b72fa7b26040e597.png)
-
jvm.cpp -
thread.cpp
- 终于在这里调用了操作系统的线程启动,
os::start_thread(thread);
Java多线程相关概念
1把锁
2个并(并发和并行)
①并发
是在同一实体上的多个事件,是在同一台处理器上“同时”处理多个任务,同一时刻,其实是只有一个事件在发生。
②并行
是在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家都真的在做事情,你做你的,我做我的
并发VS并行
3个程(进程 线程 管程)
- 通过上面start线程的案例,其实进程线程都来源于操作系统。
①进程
系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。
②线程
也被称为轻量级进程,在同一个进程内基本会有1一个或多个线程,是大多数操作系统进行调度的基本单元。
③管程
Monitor(监视器),也就是我们平时说的锁
Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。
JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,
Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。
进程VS线程
进程是…,线程是…,进程和线程的最大不同在于进程基本上是独立的,而线程不一定,线程共享****方法区和堆,线程私有****栈、本地方法栈和程序计数器
用户线程和守护线程
Java线程分为用户线程和守护线程
-
线程的daemon属性为
-
true表示是守护线程 -
false表示是用户线程。
用户线程
是系统的工作线程,它会完成这个程序需要完成的业务操作
守护线程
是一种特殊的线程,为其他线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程。
总结
public class DaemonDemo
{
public static void main(String[] args)
{
Thread t1 = new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"\t 开始运行,"+(Thread.currentThread().isDaemon() ? "守护线程":"用户线程"));
while (true) {
}
}, "t1");
t1.setDaemon(true);
t1.start();
try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("----------main线程运行完毕");
}
}
|