线程----线程状态,不同状态切换

线程6种状态

线程----线程状态,不同状态切换

状态之间切换

线程----线程状态,不同状态切换

Thread.yield(): 线程让步,使用了这个方法,当前线程就会退出CPU资源,让其他线程或当前线程使用CPU资源
  • 注意:当前线程退出CPU后,当前线程和其他线程争取CPU资源概率是一样的,也就是说当前线程退出CPU后有可能又立即抢到CPU资源的
    线程----线程状态,不同状态切换
  • 结果:线程A执行到10,让出CPU后有可能又立即抢到CPU资源,继续A线程11
    线程----线程状态,不同状态切换
Thread.sleep(): 线程休眠,主动让出当前CPU资源,在指定时间过后,CPU会返回继续执行该线程。sleep方法不会释放当前所持有的锁

线程----线程状态,不同状态切换

  • 结果:可以看到线程A休眠的时候并没有释放对象锁,结束休眠后,立即执行,也就是线程A获得锁后,线程B就处于阻塞状态,休眠时候没有释放锁资源,线程B仍然处于阻塞状态,直到对象锁释放
    线程----线程状态,不同状态切换
Thread.join(): 等待该线程死亡/终结,当前线程会等待调用该方法的线程执行完毕后才能继续执行

线程----线程状态,不同状态切换

  • 结果:当程序执行到threadA.join()时,下面代码会等待A线程全部执行完后才继续执行
    线程----线程状态,不同状态切换
Object.wait():Object类的方法,调用前必须持有对象锁,例如在synchronized代码块内,调用wait()方法后,对象锁会释放,线程进入WAITING等待状态

线程----线程状态,不同状态切换

  • 结果:线程A先获得锁,输出0,然后线程A开始等待,释放锁,B获得锁输出0(已将A线程唤醒,A处于阻塞状态),当B开始等待时释放锁,A获得锁,继续执行
    线程----线程状态,不同状态切换