Java 多线程笔记(3)——线程的生命周期

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)。(线程调度的细节取决于底层平台所采用的策略

多任务处理方式:

  1. 抢占式多任务处理(Preemption):操作系统完全决定进程调度方案。操作系统给每个可执行线程一个小时间段来处理任务,时间段结束后,系统会剥夺该线程所占用的资源,让其他线程运行。选择下一个线程时,系统会考虑线程的优先级。
    • 每个任务赋予唯一的一个优先级(有些操作系统可以动态的改变任务的优先级)
    • 优先执行优先级高的任务
  2. 协作式式多任务处理(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值