sleep与wait有什么区别
sleep()是使线程暂停执⾏⼀段时间的⽅法。wait()也是⼀种使线程暂停执⾏的⽅法,例如,当线程交互时,如果线程对⼀个同步线程x发出⼀个wait()调⽤请求,
那么该线程会暂停执⾏,被调对象进⼊等待状态,直到被唤醒或等待时间超时。
具体⽽⾔,sleep与wait的区别主要表现在以下⼏个⽅⾯:
1)原理不同。sleep是Thread类的静态⽅法,是线程⽤来控制⾃⾝流程的,它会使此线程暂停执⾏指定时间,⽽把执⾏机会会让给其他线程,等到计时时间到时,
此线程会⾃动苏醒。例如,当线程执⾏报时功能时,每⼀秒钟打印出⼀个时间,那么此时就需要在打印⽅法前⾯加上⼀个sleep⽅法,以便让⾃⼰每隔⼀秒执⾏⼀次,
该过程如同闹钟⼀样。⽽wait是Object类的⽅法,⽤于线程间的通信,这个⽅法会使当前拥有对象锁的进程等待,直到其他线程调⽤notify⽅法(或notifyAll⽅法)
时才醒来。⼀个开发⼈员也可以给它指定⼀个时间,⾃动醒来。与wait配套的⽅法有notify和notifyAll。
2)对锁的处理机制不同。由于sleep⽅法的主要作⽤是让线程休眠指定的⼀段时间,在时间到时⾃动恢复,不涉及线程间的通信,因此,调⽤sleep⽅法并不会释
放锁。⽽wait⽅法则不同,当调⽤wait⽅法后,线程会释放掉它所占⽤的锁,从⽽使线程所在对象的其他synchronized数据可被其他线程使⽤。举个简单例⼦,在⼩
明拿遥控器期间,他可以⽤⾃⼰的sleep⽅法每隔⼗分钟掉⼀次电视台,⽽在他调台休息的⼗分钟期间,遥控器还在他的⼿上。
3)使⽤区域不同。由于wait⽅法的特殊意义,所以,它必须放在同步控制⽅法或者同步语句块使⽤,⽽sleep则可以放在任何地⽅使⽤。
4)sleep⽅法必须捕获异常,⽽wait,notify以及notifyall不需要捕捉异常。在sleep的过程中,有可能被其他对象调⽤它的interrupt(),产⽣InterruptedException
异常。由于sleep不会释放“锁标志”,容易导致死锁问题的发⽣,所以,⼀般情况下,不推荐使⽤sleep⽅法,⽽推荐使⽤wait⽅法。
进程间通信和线程间通信的区别
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论