1.sleep:会让当前线程休眠进入阻塞状态并释放CPU,并不会释放锁,即使是睡眠也抱着锁不让别人访问。不推
荐使用。 sleep(long):Thread类的静态方法,必须带一个时间参数,在指定时间肯定不会被执行,让当前
运 行的程序睡眠一会,即让线程从运行状态进入阻塞状态,只有等阻塞时间过后才进入就绪状态,并不是
直接进入运行状态,是否进入运行状态就要看jvm的内部调用机制了,通常是级别高的处于就绪状态的线
程会被调度进入就绪状态。
注意:线程如果是通过继承Thread类,那么调用sleep时可以直接使用,如果是实现Runnable接口,则
必须是Thread.sleep(long)
2.yield:暂停当前正在执行的线程对象。Thread类的方法,类似sleep,但无法指定时间并且只会提供相同或
更高优先级的线程运行的机会,让出CPU,不会释放锁标志,有可能某个线程在调用了yield方法后,
又被jvm调度进来运行。实际上yield的操作:先检测当前是否有相同优先级的线程处于可运行的状
态,如有,则把CPU的占有权交给此线程,否则继续运行原来的线程。
3.wait:在其他线程调用对象的notify或notifyAlice方法时,导致当前线程等待,Object类的方法,必须放
在循环体和同步代码块中,执行该方法的线程会释放锁,并释放CPU进入线程等待池中等待被再
次唤醒(notify随机唤醒,notifyAll全部唤醒,线程结束自动唤醒)即放入锁池中竞争同步锁,
当前线程必须拥有当前对象锁,如果不是此锁的拥有者,会抛出异常。唤醒当前对象锁的等待线
程使用notify或notifyAll也必须拥有此对象锁,否则也会抛出异常。wait,notify,notifyAll用于协
调多个线程对共享数据的存取只能在同步控制方法或者同步控制块中使用。
4.join:一种特殊的wait,当前运行线程调用另一个线程的join方法,当前线程进入阻塞状态直到另一个线程运
行结束。
5.notify:将从对象的等待池中移走任意一个线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获得
锁标志,如果锁标志等待池中没有线程,则notify不起作用。
6.notifyAll:从对象池中移走所有等待那个对象的线程,并释放到锁标志池中,