首先Object中的方法:wait()、notify()、notifyAll()。java
Thread中的方法:start()、run()、sleep()、yield()、interrupt()方法。源码分析
wait和notify都须要在同步代码块中使用。this
java 线程状态转换图:spa
新建一个线程-start()->可运行-run()->运行-->死亡线程
1.若是一个运行的线程sleep(),2.t2.join()方法,3.等待用户输入,三种状况下线程会进入阻塞状态。对象
运行的线程会试图获取锁,synchronized(),线程获取到锁,就进入可运行状态,若是获取不到锁,就进入等待队列中等待;队列
若是线程调用wait()方法,JVM会把线程放入等待队列中,等待被其余进程唤醒(notify());进程
若是线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。同步
当有线程调用了对象的 notifyAll()方法(唤醒全部 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。源码
TODO: 结合源码分析。
总结点:1.sleep与wait的区别:
sleep()不会释放锁,wait会释放锁,等别的进程调用notify的时候,该阻塞的进程可能会从新得到锁;
sleep是Thread的方法,wait是Object的方法。sleep不会引发锁的变化。
join()方法具备使线程排队运行的做用,当前线程等待。jion(long )中的参数能够指定等待时间。
join()方法的内部是使用wait实现的,因此join会释放锁。
public final synchronized void join(long var1) throws InterruptedException {
long var3 = System.currentTimeMillis();
long var5 = 0L;
if(var1 < 0L) {
throw new IllegalArgumentException("timeout value is negative");
} else {
if(var1 == 0L) {
while(this.isAlive()) {
this.wait(0L);
}
} else {
while(this.isAlive()) {
long var7 = var1 - var5;
if(var7 <= 0L) {
break;
}
this.wait(var7);
var5 = System.currentTimeMillis() - var3;
}
}
}
}