线程状态:

创建状态:创建一个线程实例 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方法就进入了死亡状态

线程的几个方法:

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

2 run():执行后处于运行状态

执行完run()和start()后线程死亡

3 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后才会继续执行

4:wait(),notify(),notifyAll():

用到的情景:Synchronized语句里使用,用于线程的同步;

wait()方法调用后,线程处于阻塞状态并释放所有资源,将线程处于等待池中,其他线程调用notify()会从等待池唤醒任意一个线程并且放入锁池,调用notifyAll()唤醒所有等待池中的线程并放入锁池,锁池里的线程可以任意争取锁的权力。获得锁的线程将出入就绪状态;

如果使用wait(long time)的方法,达到时间后会自动进入锁池,不需要notify()方法唤醒

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

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

标签:调用,join,池和锁池,线程,sleep,就绪,等待,wait