线程的休眠与等待 区别(转)
2012-07-25 10:24
162 查看
关于线程间的交互和共享数据通常有轮询和通知机制。一下举例说明:Thread1和Thread2共享一块数据ShareData,Thread1使用数据,Thread2更新数据。当Thread1使用数据时发现数据没有更新就可以先休眠(sleep())一段时间然后再去判断是否更新,如此反复直到数据可用,这就是所述的轮询机制。可以看出轮询机制需要不断的轮询数据状态,很耗费资源;当采用通知机制时过程是这样的,Thread1发现数据不可用就在ShareData上等待(ShareData.wait()),当Thread2更新数据后就通知所有在ShareData上等待的线程(ShareData.notifyAll()),这样Thread1受到通知继续运行。
关于等待和休眠还有另一个区别就是当线程等待时,该线程锁定的资源是释放掉的,这时其它线程是可以锁定这些资源的,当线程被唤醒或者等待时限到时线程重新获取资源才能继续运行;而当线程休眠时线程锁定的资源是不被释放的。
还有一点就是要在对象lock上等待时是必须先要获取lock的对象锁才能进行的,即必须要类似下面的逻辑synchronized(lock){ lock.wait()}
以下为一个简单的示例:
关于等待和休眠还有另一个区别就是当线程等待时,该线程锁定的资源是释放掉的,这时其它线程是可以锁定这些资源的,当线程被唤醒或者等待时限到时线程重新获取资源才能继续运行;而当线程休眠时线程锁定的资源是不被释放的。
还有一点就是要在对象lock上等待时是必须先要获取lock的对象锁才能进行的,即必须要类似下面的逻辑synchronized(lock){ lock.wait()}
以下为一个简单的示例:
package sinpo.usagedemo; /** * 该例子说明线程休眠与等待以及注意事项。 * * @author 徐辛波(sinpo.xu@hotmail.com) * Oct 22, 2008 */ public class PendingThreadDemo { public Console console = new Console () ; private void writeToConsole1 () { synchronized ( console ){ try { Thread.sleep ( 1 * 1000 ) ; //NOTE:sleep时并未释放console别的线程是不能锁定console的 //TODO do things } catch ( InterruptedException e ) { e.printStackTrace () ; } } } private void writeToConsole2 () { synchronized ( console ){ try { console.wait ( 1 * 1000 ) ; //NOTE:wait时别的线程是可以锁定console的 //TODO do things } catch ( InterruptedException e ) { e.printStackTrace () ; } } } } //控制台类 class Console { //TODO implements me }
相关文章推荐
- 线程信息、中断、等待与休眠(二)
- 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀
- 线程中各种唤醒、等待、睡眠方法之间的区别
- 线程 线程与进程的区别 并行和并发的区别 线程安全sychronized 等待唤醒机制
- 互斥锁与自旋锁的区别(自旋锁不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等。适用场景:锁被持有时间短,并且线程不希望在重新调度上花费太多成本)
- 线程挂起和等待区别
- java多线程中等待线程与被阻塞线程的区别
- Java并发编程-02-线程的中断,休眠和等待线程的终止
- 细分线程的等待(WaitAny,WaitAll),区别于Thread.Join
- Java Thread(线程)案例详解sleep和wait的区别
- Java多线程--让主线程等待所有子线程执行完毕
- 进程和线程的区别
- 进程和线程的区别
- Linux之线程的创建、等待、终止及分离
- 线程、进程的区别
- 线程和进程的区别
- 用户级线程和内核级线程的区别
- 进程和线程的区别
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- Windows Vista/7中关机、睡眠和休眠的区别