对于我这种菜逼程序员多线程用到的机会很少,但是面试的时候又特别喜欢问到这些东西。唉,好记性不如烂笔头,花点时间去总结一下,应该印象会深刻一点。
线程基本概念
线程:是进程中的一个执行控制单元,执行路径
- 一个进程中至少有一个线程在负责控制程序的执行
- 一个进程中如果只有一个执行路径,这个程序称为单线程
- 一个进程中有多个执行路径时,这个程序成为多线程
一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此,线程也被称为轻负荷进程。一个进程中可以包含多个线程。
在JVM内存模型中,线程开辟在栈中,有些前辈称之为方法的栈帧,对于这个栈帧空间就是一个线程空间,也就是一个进程调用了一个方法,这个方法在栈中就开辟一个空间,也可以认为是线程的空间,当该方法结束后,该线程就结束,但进程还在继续执行,还会继续执行接下来的方法,继续开辟线程。
线程与进程区别
一个进程有一个或多个线程。线程更细化于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。
线程状态
1.新建
new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。
2.等待
当线程在new之后,并且在调用start方法前,线程处于等待状态。
3.就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
4.运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
5.阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
阻塞状态分为三种:
- 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
- 同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中。
- 其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态。
6.死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。
线程的生命周期
线程的生命周期是多线程很重要的知识点,对于理解整个多线程在系统的使用有很大的帮助,面试也喜欢问到的内容。
也在网上找了相关的博文,这篇博客写的还可以,讲线程的生命周期。