1.new(新建状态)
通过继承Thread、实现Runnable、Callnable接口、创建线程池等方法新建了线程对象,但是还没有调用start()方法;
2.runnable(就绪状态/可执行状态)
细分为两种状态:就绪(ready)和运行中(running)。
在创建线程对象后,其他线程调用了该对象的start()方法,该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪(ready)状态。就绪状态的线程在获取CPU时间片后变为运行中(running)状态。
3.blocked(阻塞状态)
线程在获取锁失败时(因为锁被其它线程抢占),它会被加入锁的同步阻塞队列,然后线程进入阻塞(Blocked)状态。
4.wating(等待状态)
处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。
5.timed_wating(限时等待状态)
处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。
6.terminated(死亡状态)
当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
wati与sleep的区别
wait和sleep方法都能使线程处于等待状态
1.定义
wait方法定义在Object中,基于对象锁,所有的对象都能使用。
sleep方法定义在Thread中,基于当前线程
2.条件
wait必须在同步环境(synchronized方法)下使用,否则会报IllegalMonitorStateException异常,sleep方法可在任意条件下使用
3.功能
wait/notify一起使用,用于线程间通信。wait方法用于让线程进入等待状态,notify则唤醒正在等待的线程。
sleep用于暂停当前线程的执行,它会在一定时间内释放CPU资源给其他线程执行,超过睡眠时间则会正常唤醒。
4.锁的持有
在同步环境中调用wait方法会释放当前持有的锁
调用sleep则不会释放锁,一直持有锁(直到睡眠结束)