线程五大状态及其转换
线程的五大状态分别为:创建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Dead)。
新建状态(New):即单纯地创建一个线程、
就绪状态(Runnable):在创建了线程之后,调用Thread类的start()方法来启动一个线程,即表示线程进入就绪状态!
运行状态(Running):当线程获得CPU时间,线程才从就绪状态进入到运行状态!
阻塞状态(Blocked):线程进入运行状态后,可能由于多种原因让线程进入阻塞状态,如:调用sleep()方法让线程睡眠,调用wait()方法让线程等待,调用join()方法、阻塞式IO方法。
死亡状态:run()方法的正常退出就让线程进入到死亡状态,还有当一个异常未被捕获而终止了run()方法的执行也将进入到死亡状态!
控制线程方法的介绍
Sleep()方法
-
Sleep线程休眠:指的是让线程暂缓执行,等到预计时间之后再恢复执行。 线程休眠会交出CPU,让CPU去执行其他的任务。
-
调用sleep()方法让线程进入休眠状态后,sleep()方法并不会释放锁,即当前线程持有某个对象锁时,即使调用sleep()方法其他线程也无法访问这个对象。
-
调用sleep()方法让线程从运行状态转换为阻塞状态;sleep()方法调用结束后,线程从阻塞状态转换为可执行状态。
Yield()方法
- 线程让步:暂停当前正在执行的线程对象,并执行其他线程。 调用yield()方法让当前线程交出CPU权限,让CPU去执行其他线程。
- yield()方法和sleep()方法类似,不会释放锁,但yield()方法不能控制具体交出CPU的时间。
- yield()方法只能让拥有相同优先级的线程获取CPU执行的机会。
- 使用yield()方法不会让线程进入阻塞状态,而是让线程从运行状态转换为就绪状态,只需要等待重新获取CPU执行的机会。
Join()方法
插队线程:指的是如果在主线程中调用该方法时就会让主线程休眠,让调用join()方法的线程先执行完毕后再开始执行主线程。
线程停止的方式
- 设置标志位,让线程停止
- 用Stop()方法强制停止,不安全,不建议使用
- 使用Thread类的interrupt()方法中断线程。