native:本地方法栈,c语言的函数,但凡调用的是这个接口,就是调用底层操作系统,第三方c语言的接口。
也就是说多线程和语言无关,是操作系统层面的东西。基本上每种语言都有自己的多线程实现方式。
java的前身就是c++
java语言本身底层就是c++语言
当你启动了一个线程,首先你先调用了一个
openjdk与jiava本地接口一般都是一一对应的,Thread.java对应的就是Thread.c
start0其实就是JVM_StartThread。
多线程包含:
锁:synchronized
并发:在同一实体上的多个事件,是在一台处理器上“同时”处理多个任务,同一时刻,其实是只有一个事件在发生。
并行:在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家真的都在做事情,各做各的。
进程:简单的说,在系统中运行一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。
线程:也被称为轻量级进程,在同一个进程内会有一个或多个线程,也是大多数操作系统进行时序调度的基本单元。、
管程:Monitor(监视器),也就是我们平时所说的锁,其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的的数据和代码。
JVM中同步时基于进出和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象。
Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。
一个对象被synchronized修饰,JIT编译器会告诉jvm,生成对象的同时生成monitor
java线程分为用户线程和守护线程
一般不做特别说明配置,默认都是用户线程
用户线程:
是系统的工作线程,它会完成这个程序需要完成的业务操作。
守护线程:
是一种特殊的线程,为其他线程服务的,在后台完成一些系统性的服务,如:垃圾回收线程。
守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出。
判断线程是用户线程还是守护线程有一个属性,叫isDaemon
true表示是守护线程
false表示是用户线程
public class Test2 {
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" "+Thread.currentThread().isDaemon());
},"t1").start();
}
}
结果为false,表示不是守护线程,也就是用户线程
import java.util.concurrent.TimeUnit;
public class Test2 {
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" "+Thread.currentThread().isDaemon());
while (true){
}
},"t1").start();
//暂停几秒钟线程
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" end");
}
}
可以看到,线程t1是没结束的,但是主线程已经执行完了,但是此时程序并没有退出,说明用户线程之间互不影响。
但是当我们把t1设置成守护线程时
主线程结束,程序就退出了。