Java菜鸟,初学多线程,使用的教材是《疯狂java讲义(第四版)》。有理解不到位的地方,欢迎批评指正~
(文章末尾有整个笔记的pdf版本和md版本)
Java 多线程笔记(1)——线程简介
Java 多线程笔记(2)——创建/启动线程
Java 多线程笔记(3)——线程的生命周期
Java 多线程笔记(4)——控制线程
Java 多线程笔记(5)——线程同步
Java 多线程笔记(6)——线程通信
3. 线程的生命周期
当线程被创建并启动后,它并不会直接进入执行状态,也不是一直处于执行状态。在线程的生命周期中,他要经历新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。线程启动后会在运行和阻塞之间多次切换(不能一直占用CPU独自运行)。
3.1 新建(New)和就绪(Runnable)
新建(New):当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时它和其他的Java对象一样(Java虚拟机为其分配内存,并初始化其成员变量的值)。
就绪(Runnable):当程序调用了start()方法之后,该线程就处于就绪状态(Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了)。
使用start()方法来启动线程!
如果调用run()方法,系统会把线程对象当成一个普通对象,run()方法会立即执行,并且在run()方法结束之前其他线程无法并发执行。并且,调用了run()方法之后,该方法不再处于新建状态,此时无法再调用线程的start()方法(只能对处于新建状态的线程对象调用start()方法)。
3.2 运行(Running)和阻塞(Blocked)状态
运行(Running):当处于就绪(Runnable)的线程获得了CPU,开始执行run()方法的线程执行体,则该程序处于运行状态。
在一个CPU中,任何时刻只有一个线程属于运行状态。多个线程在同一个CPU上轮换执行。
在多处理器的机器上,将会有多个线程并行。
当线程数大于处理器数时,依然会出现多个线程在同一个CPU上轮换执行。
阻塞(Blocked):为了使其他线程获得执行的机会,线程在运行过程中会被中断(除非线程足够短,瞬间执行结束),此时称该线程被阻塞(Blocked)。(线程调度的细节取决于底层平台所采用的策略)
多任务处理方式:
- 抢占式多任务处理(Preemption):操作系统完全决定进程调度方案。操作系统给每个可执行线程一个小时间段来处理任务,时间段结束后,系统会剥夺该线程所占用的资源,让其他线程运行。选择下一个线程时,系统会考虑线程的优先级。
- 每个任务赋予唯一的一个优先级(有些操作系统可以动态的改变任务的优先级)
- 优先执行优先级高的任务
- 协作式式多任务处理(Cooperative Multitasking):下一个进程调度的前提是当前进程主动放弃所占用的资源。
当发生如下情况时,线程将会进入阻塞状态:
- 线程调用sleep()方法主动放弃所占用的处理器资源
- 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
- 线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有
- 线程正在等待某个通知(notify)
- 程序调用了线程的suspend()方法将该线程挂起(容易导致死锁,应避免使用)
被阻塞的线程会在以先特定情况时解除,使该线程重新进入就绪状态:
- 调用sleep()方法的线程经过了特定时间
- 线程调用的阻塞式IO方法已经返回
- 线程成功的获得了试图取得的同步监视器
- 线程正在等待某个通知时,其他线程发出了一个通知
- 处于挂起状态的线程被调用了resume()恢复方法
3.3 线程死亡
线程会以如下三种方式结束,结束后就处于死亡状态:
- run()或call()方法执行完成,线程正常结束
- 线程抛出一个未捕获的Exception或Error
- 直接调用该线程的stop()方法来结束该线程(容易死锁,通常不推荐使用)
可用isAlive()方法判断线程是否已经死亡。当线程处于就绪、运行、阻塞三种状态时,该方法将返回true;当线程处于新建、死亡两种状态时,该方法返回false
已经死亡的线程不可用start()方法重新启动
完整笔记下载:
pdf版链接:https://pan.baidu.com/s/1AxAo3ZLwf5EwUV6i6yWp8Q
提取码:6jom
md文件链接:https://pan.baidu.com/s/1tX0HCJteEVwCoXC0Hkw68Q
提取码:99t1