1、前言:
2、状态概述
3、状态详述
3.一、
初始状态(New)start()
方法进入就绪状态。new
关键字创建一个线程对象后,该线程对象就处于新生状态。3.二、
就绪状态(Runnable)描述java
就绪状态并非执行状态,当系统选定一个等待执行的Thread
对象后,它就会进入执行状态。安全
run()
方法条件多线程
1. 新建线程:调用**start()**方法,进入就绪状态; 2. 阻塞线程:阻塞解除,进入就绪状态; 当前线程sleep()方法结束, 其余线程join结束,等待用户输入完毕,某个线程拿到对象锁, 这些线程也将进入就绪状态。 3. 运行线程:当前线程时间片用完了,调用**yield()**方法,直接进入就绪状态; 4. 运行线程:JVM将CPU资源从本线程切换到其余线程。
3.三、
运行状态(Running)描述 :处于运行状态的线程最为复杂。线程
run()
方法中的代码,直到调用其余方法而终止或等待某资源而阻塞或完成任务而死亡线程从运行状态变为阻塞状态的条件code
sleep()
方法主动放弃所占用的系统资源阻塞式IO
方法,在该方法返回以前,该线程被阻塞notify()
)⑤、程序调用了线程的suspend()
方法将线程挂起对象
suspend()
容易致使死锁,程序应该尽可能避免使用该方法线程从运行状态变为死亡状态的条件生命周期
run()
方法执行完,stop()、desyory()
3.四、
阻塞状态 (Blocked)描述队列
synchronized
关键字修饰的方法或代码块(获取锁)时的状态条件事件
1. 执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。 当指定的时间到了后,线程进入就绪状态。 2. 执行wait()方法,使当前线程进入阻塞状态。当使用nofity()方法唤醒这个线程后, 它进入就绪状态。 3. 线程运行时,某操做会阻塞,eg:执行IO流操做(read()/write()方法自己就是阻塞的方法)。 只有当引发该操做阻塞的缘由消失后,线程进入就绪状态。 4. join()线程联合: 当某个线程等待另外一个线程执行结束后,才能继续执行时, 使用join()方法。
附:内存
sleep()方法,线程是抱着资源睡觉(不释放资源)。
分类
- **等待阻塞:**运行状态的线程执行 `wait()`方法,使线程进入到**等待阻塞**状态。 - **同步阻塞:**线程在获取 `synchronized` 同步锁**失败**(由于同步锁被其余线程占用)。 - **其余阻塞:** - 经过调用线程的 `sleep()` 或 `join()` 发出了 `I/O` 请求时,线程就会进入到阻塞状态。 - 当`sleep()` 状态超时,`join()` 等待线程终止或超时,或者 `I/O` 处理完毕,线程从新转入就绪状态。
3.五、
死亡状态 (Terminated)描述
java.lang.IllegalThreadStateException
异常缘由
1.正常运行的线程完成了它run()方法内的所有工做 2.线程被强制终止,如经过执行stop()或destroy()方法来终止一个线程。 (注:stop()、destroy()方法已经被JDK废弃,不推荐使用,不安全)。 3.线程抛出未捕获的异常
4、续...