Java 的wait(),sleep()详解
Contents
wait和sleep都是可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯问题。
在java.lang.Thread类中,提供了sleep()。
在java.lang.Object类中提供了wait(),notify()和notifyAll方法来操作线程。
sleep可以将一个线程睡眠,参数可以指定一个时间。
wait可以将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds)
sleep和wait的区别
- 这两个方法来自不同的类分别是Thread和Object
- 最主要是sleep方法没有释放锁,而wait释放了锁,使得其他线程可以使用同步控制块或者方法。
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。例
synchronized(x){
x.notify()
//或者wait()
} - sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
sleep使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用,目的是不让当前的线程独自霸占该进程所获的CPU资源,以留一定的时间给其他线程的执行机会。
sleep是Thread里面的Static(静态)的方法,因此他不能改变对象的机锁,所以在一个Sychronized块中调用sleep方法是,线程虽然休眠了,但是对象的机锁并没有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
在sleep休眠时间期满后,该线程不一定会立即执行,这是因为其他线程可能正在运行并且没有被调度为放弃执行,除非线程具有更高的优先级。
wait数Object类里面的方法,当一个线程执行到wait方法时候,就进入到一个和该对象相关的等待池中,同时失去(释放了)对象的机锁(暂时失去机锁),wait(long timeout)超时时间到后还需要返回对象锁,其他线程可以访问。
wait必须放在sychronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException”。