线程的几个状态及方法,等待池和锁池的理解

线程状态:

创建状态:创建一个线程实例 Thread thread = new Thread();
就绪状态:在调用start()方法后,线程获取了除CPU的其他资源,处于就绪状态
执行状态:线程获取CPU使用权,run方法开始执行
阻塞状态:运行中的线程由于其他原因放弃对CPU使用(其他线程抢占)而处于阻塞状态:

1 等待阻塞:调用wait()方法,该线程释放所有资源,包括CPU()资源和锁资源,并且释放锁标志,jvm会把该线程放入等待池,不会自动唤醒,要等待其他线程的notify()或notifyAll()唤醒该线程才会重新获得锁标志并且出入就绪态

2 同步阻塞:由于线程获取同步锁synchronized失败而处于阻塞状态

3 其他阻塞:sleep()方法或join()方法,该类型阻塞会自动唤醒,sleep()超时,join()等待子线程完成后线程会自动唤醒而处于就绪状态,该状态不会释放锁资源,但会释放CPU()资源,会暂时放弃对CPU的占有。
死亡状态:线程执行完run方法或退出run方法就进入了死亡状态

线程的几个方法:

  • start():调用start()处于就绪状态

  • run():执行后处于运行状态
    执行完run()和start()后线程死亡

  • sleep(),join()和wait()区别:

sleep,join会释放Cpu资源,但不会释放锁资源,而且会自动唤醒。但是sleep()和join又有不同:
sleep()是自身线程调用,且阻塞超过一定时间后进入就绪态,然后获取Cpu继续执行,而join是其他线程的调用,自身线程阻塞,等待其他线程执行完后进入就绪态,然后获取Cpu让自身线程继续执行。
区别:join内部调用了wait(),是会释放锁的,其他线程可以调用该线程的同步方法,sleep()不具备放锁特点,该线程执行完才会放锁,是static的静态方法;
join()方法遇到interrupt()方法会出现interrupt异常,B.join(),A等待B线程执行,这是遇到了interrupt(),B会暂停但是A会继续执行。
wait()会释放Cpu资源和锁资源,不会自动唤醒。必须要其他线程调用notify()或notifyAll()才会唤醒到达就绪态,获取Cpu后才会继续执行

  • wait(),notify(),notifyAll():
    用到的情景:Synchronized语句里使用,用于线程的同步;
    wait()方法调用后,线程处于阻塞状态并释放所有资源,将线程处于等待池中,其他线程调用notify()会从等待池唤醒任意一个线程并且放入锁池,调用notifyAll()唤醒所有等待池中的线程并放入锁池,锁池里的线程可以任意争取锁的权力。获得锁的线程将出入就绪状态;
    如果使用wait(long time)的方法,达到时间后会自动进入锁池,不需要notify()方法唤醒

  • yield()方法:与sleep()类似,不会释放锁,执行后让线程直接回到就绪状态;可能执行完yield()方法的线程马上又被执行;同优先级和优先级高的线程得到执行机会

三 等待池和锁池的理解:当调用了wait()方法,释放锁资源和Cpu资源,线程进入等待池,当其他线程调用notify()会从等待池任意选择一个线程调入锁池,notifyAll()会调用所有等待池线程进入锁池,锁池里的对象可以竞争锁,优先级高的获得锁的能力更强,获得锁的线程可以进入就绪态继续执行,执行完之后释放锁,然后锁池里的线程再继续竞争。

你可能感兴趣的:(线程的几个状态及方法,等待池和锁池的理解)