线程调度中sleep(),wait(),yield()的区别

 1、sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。 
 2、当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。 
 3、sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常 
 4、sleep()方法比yield()方法具有更好的移植性
 5、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待os分配时间片;
 6、当线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
 7、当线程刚进入可运行状态(即就绪状态),发现将要调用的资源被synchronized(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,即先到先得)一旦线程获得锁标记后,就转入可运行状态,等待os分配CPU时间片;
 8、当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁。它被一个notify()方法唤醒时,等待池中的线程就被放到锁池中。该线程从锁池中获得锁,然后回到wait()前的中断现场。

 9、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(wait(1000)时可以自动唤醒)由于notify()只是唤醒一个线程。但我们由于不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够唤醒,因此在实际使用时,一般都用notifyAll(),方法唤醒所有线程(),当线程被唤醒后会进入锁池,等待获得锁标记,此时线程处于就绪状态。

10、sleep()是线程方法,而wait()是Object方法。

转自:http://blog.csdn.net/ningxuezhu/article/details/7549393

猜你喜欢

转载自blog.csdn.net/u012198209/article/details/79653352