JVM的角度了解线程和进程的关系 Link to heading
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,
Java中,Java线程的本质就是操作系统的线程
线程模型是用户线程和内核线程之间的关联方式,常见的线程模型有这三种:
- 一对一(一个用户线程对应一个内核线程)
- 多对一(多个用户线程映射到一个内核线程)
- 多对多(多个用户线程映射到多个内核线程)
在 Windows 和 Linux 等主流操作系统中,Java 线程采用的是一对一的线程模型,也就是一个 Java 线程对应一个系统内核线程。
为什么java线程的程序计数器,虚拟机栈和本地方法栈是私有的?
PC记录的是下一条指令的地址,私有的目的是为了线程切换后能恢复到正确的执行位置
虚拟机栈:
每个Java方法在执行之前会创建一个栈帧用于存储局部变量,操作数栈,常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
本地方法栈:
和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。
Java创建线程方法 Link to heading
-
继承Thread类,重写run方法
//继承Thread类,重写run方法 public class TestThread1 extends Thread { @Override public void run() { for(int i = 0; i < 200; i++) { System.out.println("我在看代码"+i); } } public static void main(String[] args) { TestThread1 t1 = new TestThread1(); t1.start(); for(int i = 0; i < 200; i++) { System.out.println("我在学习多线程"+i); } } }
线程不一定立即执行,由cpu安排调度
-
实现Runnable接口(第一种方式继承的Thread类实际上也实现了Runnable接口)