Java中sleep()和wait()的区别
2016-01-11 10:58
393 查看
1. 这两个方法来自不同的类,sleep方法属于Thread,wait方法属于Object。
2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait, notify和notifyAll只能在同步控制方法(synchronized)或者同步控制块里面使用,而sleep可以在任何地方使用。
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
详解:
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,但它不会马上进入运行状态,因为其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级; (b)正在运行的线程因为其它原因而阻塞。 一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在 sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,不能通过t.sleep()让t对象进入sleep。
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。从而使线程所在对象中的其它synchronized数据可被别的线程使用。 wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生InterruptedException,效果以及处理方式同sleep()方法。
2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait, notify和notifyAll只能在同步控制方法(synchronized)或者同步控制块里面使用,而sleep可以在任何地方使用。
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
详解:
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,但它不会马上进入运行状态,因为其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级; (b)正在运行的线程因为其它原因而阻塞。 一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在 sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,不能通过t.sleep()让t对象进入sleep。
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。从而使线程所在对象中的其它synchronized数据可被别的线程使用。 wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生InterruptedException,效果以及处理方式同sleep()方法。
相关文章推荐
- 【第七章】 对JDBC的支持 之 7.2 JDBC模板类 ——跟我学spring3
- java,file,算法,加密解密,java源码
- Spring Cache
- Java ClassLoader机制
- Java之Pcap文件解析(一:Pcap格式分析)
- Java线程池
- 通过java反射机制获取该类的所有属性类型、值。
- Java魔法堂:注释和注释模板 (转)
- jvm钩子:Java应用中使用ShutdownHook友好地清理现场
- JAVA中extends 与implements区别
- java中将list、map对象写入文件
- eclipse jetty maven debug参数配置
- java String->float,float->int
- java日志组件介绍(common-logging,log4j,slf4j,logback )
- 解决 ubuntu KDE桌面环境下Eclipse新建项目闪退问题
- java内存计算
- Java中的Abstract关键字的使用注意点
- 隐藏actionBar, 报错 getActionBar.hide() 运行时java.lang.NullPointerException
- Java集合类ArrayList循环中删除特定元素
- poi导出excel