前言
线程是我们在日常开发中做必须要掌握的技能,但是很多人都对其中的一些概念不够明确,如线程和进程等,所以我们先来了解一下这两个名词的概念:
进程
进程就是正在运行中的程序(进程是驻留在内存中的)。
- 是系统执行资源分配和调度的一个独立的单位;
- 每一进程都有属于它自己的存储空间和系统资源。
注意:进程A和进程B的内存是独立不共享。
线程
线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径。
- 单线程:一个进程中包含一个顺序控制流(一条执行路径);
- 多线程:一个进程中包含多个顺序控制流(多条执行路径);
线程A和线程B,在堆内存和方法区内存中是共享。但是栈内存是相互独立,一个线程一个栈。
java中多线程的生命周期
在线程的生命周期中,需要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和消亡(Dead)5种状态
- 新建状态 :当程序使用new关键字创建了一个线程之后,该线程就是处于一个新建状态,此时由JVM为其分配内存,并初始化其相关的成员变量的值
- 就绪状态 :当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建一个方法来调用栈和程序计数器,等待调度运行
- 运行状态 :如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体时,则该线程就处于运行状态
- 阻塞状态 :当处于运行状态的线程失去所占用资源之后,便进入阻塞状态
- 死亡状态 :线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。
注意:在创建一个线程之后,启动线程的时候要调用start()方法,而不能直接调用run()方法。单纯调用run()方法不会启动线程,不会分配新的分支栈。
start()方法的作用是:启动一个分支的线程,并在JVM中开辟一个新的栈空间,执行完代码后,线程就启动成功了。启动成功的线程会自动调用run()方法(由JVM线程调度机制来运作的),并且run()方法在分支栈的栈底部(压栈)。
run()方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的。
所以单纯使用run()方法是不能多线程并发的。