这里先说明一下锁对象,如果一个类比如Person里的方法都有synchronized来修饰,那么每一个方法的锁对象就是Person的一个实例person.
锁对象也可以针对某个特定的实例, 比如synchronized(bird) {//code;}, 此时的锁对象就是bird这个实例。
1. sleep
使得当前线程睡一会,醒来后继续被服务。 这样就会让其他优先级的线程(较低,同级或是高优先级)得到机会执行。
*Sleep 不会释放对象锁,也就是虽然当前线程暂停运行,但是如果它有对应的锁对象(比如当前方法是synchronized修饰的), 其他线程都无法再得到this锁对象,
所以其他synchronized方法或是synchronized(this)修饰的代码块,都不会执行。
2. yield
使得当前线程还是就绪状态,它会首先查看是否有其他同优先级的线程,如果有,则运行其他线程,如果没有,就继续原来的线程。
*yield 也不会释放对象锁
3. join
线程A调用了线程B的join方法,那么线程A会等到线程B执行完后,才继续运行后边的代码。
sleep(),yield(),join()在Thread类中定义
3. wait, notify 和 notifyAll
wait,notify 和 notifyAll都是用来执行同步的代码,所以它们都是在synchronized代码块中。
他们都是Object的方法,所以都是针对于一个对象,比如Student类对象student。
wait表明,当前线程放弃锁对象(student.wait(), 此时的锁对象是student实例), 并将自己放入对象等待池中。此时,其他的线程就可以得到锁对象,并且运行。
wait还可以传入参数,wait(long timeout);
notify表明,从对象等待池中,移出一个转入到锁状态等待池,如果此线程得到了锁,就执行。
notifyAll表明,从对象等待池中,移除所有线程到锁状态等待池
当线程A对线程B调用interrupt()方法时,如果线程B正在运行业务逻辑,它不会退出,直到线程B运行到wait(),sleep()和join()方法时,才会抛出InterruptedException.