关闭

Java多线程之状态与生命周期

标签: java多线程
246人阅读 评论(0) 收藏 举报
分类:

线程的生命周期

线程创建并启动后,不是一启动就进入执行状态,也不会一直处于执行状态。

线程启动后不可能一直霸占CPU,所以CPU会在多线程之间切换,于是线程状态也会多次在运行、阻塞之间切换

在线程的生命周期中,线程共有5种状态,在任意时刻,线程的状态只能是其中的一种

状态 说明
New 初始状态 —>使用new关键字,创建一个线程,但是还没有调用start方法,仅仅由JVM分配内存,并初始化成员变量
Runnable 就緒状态 —> 调用start()后处于就绪状态,JVM为其创建方法调用栈和程序计数器,但线程并没有开始运行,仅表示可以运行。何时开始,取决于JVM里的线程调度器的调度
Running 运行状态 —>处于就绪状态的线程,获得了CPU,开始执行run()方法,则处于运行状态
Blocked 阻塞状态 —> 表示线程阻塞于锁。线程之间需要切换,时间段用完后,系统会剥夺线程占用的资源,让其他线程执行,选择哪个线程,系统会考虑线程的优先级。调用sleep(),调用阻塞式IO方法,等待同步锁,等待通知wait(),suspend(),join(),这些将使得线程进入阻塞状态
Waiting 等待状态 —> 进入该状态后需要其他线程做出通知动作,也可以算是阻塞状态。需要notify()唤醒线程,使之进入就绪状态
Time_Waiting 超时等状态状态 —> 该状态与WAITING不同,它是可以在指定时间内自行返回的。相当于在等待状态基础上,增加了时间的限制,超过了设定的时间限制就会返回到运行状态
Dead 死亡状态 —> 线程执行完毕。run()或call()执行完成,线程抛出未捕获的Exception或Error,调用该线程的stop(),都会结束线程。

这里写图片描述
为了测试线程是否已经死亡,可以调用线程对象的isAlive()方法,若处于就绪、运行、阻塞三种状态,方法返回true;若线程处于新建、死亡状态,方法返回false。

不能对已经死亡的线程调用start()方法,重新启动,否则抛IllegalThreadStateException异常

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12305次
    • 积分:746
    • 等级:
    • 排名:千里之外
    • 原创:65篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条
    文章分类