1. 进程与线程
- 进程定义:进程是程序的一次执行过程,是系统进行资源分配和调度的
基本单位
。 - 线程定义:现代操作系统调度的
最小单元
是线程,也叫轻量级进程
,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量
等属性,并且能够访问共享的内存变量。 - Java进程与线程的关系?
在Java中,当我们启动main函数时,就启动了一个JVM的进程
,其中包括几个同时运行的线程
,main函数的执行位于其中一个线程中。
多个线程共享进程的堆和方法区(元空间)
,同时每个线程有自己的程序计数器、虚拟机栈、本地方法栈
。 - 进程与线程的区别?
进程之间基本上是独立的,有利于资源管理和保护,进程执行开销大;而线程则相反,同一进程中的线程可能会相互影响。
2.多线程的优点和挑战
为什么要使用多线程?
a. 线程间的切换和调度远小于进程,多线程在多核CPU上同时运行会减少线程上下文切换的开销。
b.多线程机制可以提高系统整体的并发能力和性能,满足高并发量下的业务需求,提高程序的执行效率和运行速度。使用多线程有哪些挑战?
a. 上下文切换:CPU在线程间切换执行时,需要保存线程状态,这带来了一定的时间和空间开销,因此应该尽量减少
上下文切换的次数。
b.死锁:两个线程互相等待对方释放锁,这会造成系统不可用,应该避免
死锁发生。
c.资源限制:程序的执行速度受限于计算机硬件资源或软件资源,这时开更多线程也没用,需要根据不同的资源限制调整
程序的并发度。
3. Java线程的生命周期(状态)
- NEW
NEW(初始)
状态,线程被构建,即new Thread()
- RUNNABLE
thread.start()后,进入RUNNABLE(运行)
状态,该状态包括两种可能:如果线程获得了CPU时间片那么其处于操作系统定义的运行中状态,否则处于操作系统定义的就绪状态,JVM将这两种状态统称为运行状态
。 - BLOCKED
如果线程需要进入同步方法或同步代码块,即需要获取锁,但需要等待锁被释放时,进入BLOCKED(阻塞)
状态 - WAITING
线程执行wait()
方法后,进入WAITING(等待)
状态,需要依靠其他线程
的通知才能返回运行状态。 - TIME_WAITING
线程执行sleep(millis),wait(millis)
方法后,进入TIME_WAITING(超时等待)
状态,当时间到达后,线程会自动
返回RUNNABLE状态。 - TERMINATED
线程的run方法执行完成后或者产生异常后进入TERMINATED(终止)
状态。
图片引用自方腾飞 魏鹏 程晓明《Java并发编程的艺术》机械工业出版社