首先看一下,java中线程状态转换简图,因为以上的线程操作都是调度线程从某一个状态到另外一种状态的切换。
Sleep()方法
在java中Sleep方法主要用于让当前处于运行态的线程变为休眠态。这样系统在调度可运行的线程进入运行态时就不考虑此线程。同时休眠时间结束,该线程也不是直接进入运行态,而是进入可运行的队列,等待系统的调度。
线程从运行态进入休眠态并不释放对象锁,因为线程休眠的时间是可以由程序定的,而进入可运行态却是由操作系统确定的。
wait()方法
在java中wait方法,在Java中Object对象有wait方法,所以每个对象继承拥有了wait方法。
Wait方法的作用是拥有对象a的锁的线程释放该锁给别的线程。因为处于锁定同步方法或同步代码块内的代码失去锁则无法继续执行。调用wait()方法也会让线程从运行态切换到不可运行态(即等待,阻塞,睡眠),所以等待其他线程调用notify()或者notifyall()方法才有可能让该线程从不可运行态变到可运行态。
notify()方法
notify()方法和wait()方法类似,都是Object对象所拥有的方法,每个对象都默认有notify()方法。调用 specialObject.notify()方法就是当前线程释放对象锁,让其他等待该线程锁的某一个线程获得该对象锁,从而从阻塞态变为可运行态。等待系统调度该线程进入运行态。Notifyall()的区别则是将所有等待该对象锁的wait线程全部退出wait状态去竞争对象锁。
注意:
notify()是选择一个线程并获得对象锁。
Notifyall()是让所有方法退出wait状态,最后只会有一个对象获得对象锁。
pdf下载:/Files/zhenxuanpan/java多线程一.pdf