线程的状态
线程有五种状态,分别为:新建、就绪、运行、阻塞、死亡。
- 新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
- 就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已 具备了运行的条件,只是没分配到CPU资源
- 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线 程的操作和功能
- 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中 止自己的执行,进入阻塞状态
- 死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束
Sleep方法
sleep方法是线程(Thread)的方法,调用该方法会使线程进入阻塞状态。调用时要传入一个毫秒数,当到达指定的毫秒数以后线程会回到就绪状态。
Wait方法
wait是Object类的方法,线程调用该方法后会进入阻塞状态,直到被notify方法唤醒,被唤醒后会进入就绪状态。与sleep方法的不同之处在于wait方法会释放锁而sleep方法不会释放锁。wait方法常用于线程间的交互而sleep方法通常用于暂停线程执行。
yield方法
yield方法可以称为线程的礼让。线程调用yield方法主动放弃cpu资源并进入就绪状态。值得注意的是线程调用yield方法进入就绪状态后任然会参与cpu资源的争夺。
suspend 方法
suspend方法会让线程进入阻塞状态直到调用resume方法让线程回到就绪状态。这种方法已被弃用,因为它本身就是死锁的。 如果目标线程在挂起时保护关键系统资源的监视器上的锁定,则在目标线程恢复之前,线程不能访问该资源。 如果要恢复目标线程的线程在调用resume之前尝试锁定此监视器, resume导致死锁。 这种僵局通常表现为“冻结”过程。
join方法
join方法就是让这个线程加入,直到死亡或到达指定时间。例如,在A线程中有B.join(),那就意味着A线程会进入阻塞状态,直到B线程死亡。此实现使用this.wait调用的循环,条件为this.isAlive 。 当线程终止时,调用this.notifyAll方法。调用join()和调用join(0)效果相同,都是永久等待。