Java学习笔记之线程的生命周期
来源:互联网 发布:cpi数据分析 编辑:程序博客网 时间:2024/05/18 02:20
在线程的生命周期中,要经过创建(new)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。
当程序中多条线程启动后,CPU就会在多条线程之间切换运行,于是线程状态也会多次在运行、阻塞之间切换。
新建和就绪状态:
当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由虚拟机为其分配内存,并初始化其成员变量的值。程序也还没开始执行线程体。
当线程对象调用start()方法后,该线程就处于就绪状态,虚拟机会为其创建方法调用栈和程序计数器,此时表示该线程可以运行了,是否开始运行何时开始运行取决与JVM里线程调度器的调度。
注意:线程应该调用start()方法来启动,如果直接调用线程对象的run()方法,则run()方法会立即被执行,而且在run()方法返回之前其他线程无法并发地执行,即系统把线程对象当成一个普通对象,而run()方法也是一个普通方法。
运行状态和阻塞状态:
如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,该线程就处于运行状态。
线程进入阻塞状态的情况:
1.线程调用了sleep()方法主动发起占用的处理器资源。
2.线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
3.线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
4.线程在等待某个通知(notify)。
5.程序调用了线程的suspend()方法将该线程挂起。这个方法容易导致死锁。
线程被阻塞之后,其他线程就会获得执行的机会。被阻塞的线程会在合适的时候重新进入就绪状态,等待线程调度器调度。
如下情况下可以解除线程的阻塞:
1.调用sleep()方法的线程过了指定时间。
2.线程调用的阻塞式IO方法已经返回。
3.线程成功地获得了试图取得的同步监视器。
4.线程正在等待某个通知时,其他线程发出了一个通知。
5.处于挂起状态的线程被调用了resume()回复方法。
线程死亡:线程会以3中方式结束,结束后就处于死亡状态
1.run()或call()方法执行结束,线程正常结束
2.线程抛出一个未捕获的Exception或Error
3.直接调用该线程的stop()方法来结束该线程,该方法容易导致死锁。
线程对象的isAlive()方法在线程处于就绪、运行、阻塞状态时返回true,在线程处于新建、死亡状态时返回false。
程序只能对处于新建状态的线程调用start()方法启动线程。
- Java学习笔记之线程的生命周期
- Java学习笔记之线程(一):线程的创建和生命周期
- (46)Java学习笔记——多线程 / 线程的生命周期
- java学习初探十八之线程的生命周期
- Java学习笔记之线程的控制
- JAVA多线程学习笔记<2>线程的生命周期与线程栈
- Java SE学习笔记:线程通信、生产者与消费者案例、线程状态(线程的生命周期)、线程操作、Condition类
- iOS学习之 - 线程的生命周期
- Java多线程学习:线程的生命周期
- Java 之 线程的生命周期(一)
- Java 之 线程的生命周期(二)
- Java 之 线程的生命周期(三)
- java多线程之线程的生命周期
- Java学习笔记之线程(二):线程的常用方法
- Java学习笔记之线程(四):线程的死锁现象
- Java学习笔记之线程(五):线程的通讯
- Java学习笔记之线程(六):线程的停止
- java学习之线程笔记
- 如何超快且装备
- 一辈子的好人
- MaxDot照片秀(on github page)
- C project source that could be learnt
- 1.2 css的引入方法
- Java学习笔记之线程的生命周期
- 共享收集的图像处理方面的一些资源和网站。
- SQL Server 知识梳理七 程序设计
- 为什么IIS的应用池回收设置默认为1740分钟
- 线程同步使用方法:CMutex_CEvent_关键代码段
- MySql安装及导入导出
- centos FTP服务器的架设和配置
- iPhone网易新闻和凤凰新闻客户端
- 实例分析Java Class的文件结构