1,new新建
new Thread(r)时,线程还没开始运行
2,Runnable可运行状态
一旦调用start方法,线程就处于可运行状态
3,Blocked阻塞状态
阻塞或等待状态时,线程暂时是不活动的,它不运行任何代码,而且消耗最少的资源。
当一个线程获取一个内部的锁对象时,这个锁被其他线程占用。
4,Waiting无限等待状态
使用锁对象调用wait方法时
5,Timed waiting 计时等待状态
调用sleep方法或者wait(long timeout)方法时
6,Terminated终止状态
run方法执行完,或者出现异常未捕获而终止。
线程状态的的切换:
1,调用wait方法和notify方法都需要相同的锁对象才可以
2,使用锁对象调用wait方法进入无限等待状态
3,使用notify方法唤醒无限等待状态的线程
4,调用sleep方法线程进入计时等待状态,那么该线程就不会霸占cpu资源
5,调用wait方法进入无线等待状态,那么该线程不会霸占cpu资源,也不会霸占锁对象
6,进入无限等待状态的线程,如果被其他线程唤醒,但是没有获取到锁对象,那么就进入到了锁阻塞状态
7,通过wait(long Timeout)进入计时等待状态,如果时间到了被唤醒并且获取到锁对象那么就进入可运行状态,如果没有获取到锁对象那么就进入锁阻塞状态。如果时间没到被唤醒并且获取到锁对象那么就进入可运行状态,如果没有获取到锁对象那么就进入锁阻塞状态。
- public class Test {
- public static void main(String[] args) {
- //线程1 无线等待状态
- new Thread(()->{
- synchronized (Test.class) {
- //加锁快捷键ctrl+alt+t
- System.out.println(Thread.currentThread().getName()+"进入无限等待状态");
- try {
- Test.class.wait();//释放锁不会争夺cpu
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()+"被唤醒");
- }
- }).start();
- //线程2 唤醒线程1无限等待状态
- new Thread(()->{
- synchronized (Test.class) {
- //加锁快捷键ctrl+alt+t
- System.out.println(Thread.currentThread().getName()+"唤醒无限等待状态");
- //唤醒
- Test.class.notify();
- //等待5秒后再释放锁,上面虽然唤醒了线程一,但是线程一并拿不到锁,所以会等待5秒
- try {
- Thread.sleep(5000);//sleep并不会释放锁
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println(Thread.currentThread().getName()+"执行完毕");
- }
- }).start();
- }
- }