sleep()方法和wait()方法之间有什么差异?
sleep()方法用被用于让程序暂停指定的时间,而wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者nofifyAl()方法
主要的区别是,wait()释放锁或监视器,然而sleep()不释放任何锁或监视器等。wait被用于线程间通信,而sleep一般来说被用于在执行时引入暂停。
Thread.sleep()让当前线程进入不可运行状态一段时间。线程继续保持它所获取的监视器——即如果线程当前处于同步块或方法中,则没有其他线程可以进入此块或方法。如果另一个线程调用t.interrupt()会唤醒sleep的线程。注意,sleep()是一种静态方法,这意味着它总是影响当前线程(执行睡眠方法的线程)。一个常见的错误是用t.sleep期望不同的线程休眠,但实际上是当前线程休眠。
object.wait()让当前线程进入不可运行状态,如sleep()一样,但不同的是wait方法从一个对象调用,而不是从一个线程调用;我们称这个对象为“锁定对象(lockObj)”。在lockObj.wait()被调用之前,当前线程必须在lockObj上同步(synchronize);然后调用wait()后释放这个锁,并将线程增加到与lockObj相关的“等待名单(wait list)”。然后,另一个在同一个lockObj锁定(synchronize)的方法可以调用lockObj.nofity()。这会唤醒原来等待的线程。基本上,wait() / notify()就像sleep() / interrupt(),只是活动线程不需要直接指向一个睡眠线程,他们只需要共享锁对象(lockObj)。
synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}
让我们将上面的要点分类:
调用:
- wait():在对象上调用,并且当前线程必须在一个lockObj上同步。
- sleep():在Thread上调用,总是当前正在执行的线程。
同步:
- wait():如果同步,那么多个线程会一个一个的访问对象。
- sleep():如果同步,多个线程都会等休眠线程苏醒。
维持锁:
- wait():释放锁,让其他对象机会执行。
- sleep():执型超时或者调用interrupt之前保持锁。
苏醒条件:
- wait():直到由对象调用notify(), notifyAll()
- sleep():执型超时或者调用interrupt之前保持锁。
用途:
- sleep():时间同步;
- wait():多线程同步。
希望以上信息能给你的知识库增加一些价值。
Happy Learning !!
sleep()方法和wait()方法之间有什么差异?的更多相关文章
- ThinkPHP的D方法和M方法的区别
		M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ... 
- Android HTTP实例 使用GET方法和POST方法发送请求
		Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ... 
- wait方法和sleep方法的区别
		一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行. ... 
- M方法和D方法的区别
		M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ... 
- ThinkPHP 中M方法和D方法详解----转载
		转载的地址,http://blog.163.com/litianyichuanqi@126/blog/static/115979441201223043452383/ 自己学到这里的时候,不能清除的分 ... 
- ThinkPHP 中M方法和D方法的具体区别(转)
		M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ... 
- 彻底理解了call()方法,apply()方法和bind()方法
		javascript中的每一个作用域中都有一个this对象,它代表的是调用函数的对象.在全局作用域中,this代表的是全局对象(在web浏览器中指的是window).如果包含this的函数是一个对象的 ... 
- Hibernate中Session.get()方法和load()方法的详细比较
		一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ... 
- Get方法和post方法有何不同?
		Get方法和post方法有何不同? 在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的.Form提供了两种数据传输的方式——get和post.虽然它们都 是数据的提交方式, ... 
随机推荐
- linux 下创建管理员权限账户
			1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing pass ... 
- js正则表达式详解
			一.正则的两种写法: var re = /a/; //一般情况下都用简写的方式 性能好 var re = new RegExp('a'); //需要传入参数的时候用 二.转义字符: \n 换行 \r ... 
- hdu1011 Starship Troopers 树形DP
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 思路:很明显的树形背包 定义dp[root][m]表示以root为根,派m个士兵的最优解,那么d ... 
- Struts流程分析+源码分析
			1.初始化工作 读取配置---转换器-----读取插件 当struts-config.xml配置文件加载到内存,则会创建两个map:ActionConfigs,FromBeans.这两个map都交由M ... 
- 大数的加法运算,杭电oj-1002
			原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1002 [Problem Description] I have a very simple pro ... 
- nginx+tomcat集群负载均衡(实现session复制)
			转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ... 
- SharePoint 无法删除搜索服务应用程序
			在SharePoint的使用中,经常会遇到某些服务创建失败,某些服务删除不成功的情况.这里,我们就遇到了搜索服务创建失败,然后删除也不成功,使用管理中心的UI无法删除,PowerShell命令也无法删 ... 
- 根据源码用HttpServletRequest获取MultipartFile的问题
			问题 由于某些原因,现在需要这样的一个文件上传接口,这个接口type(String)是必传参数,photoFile(MultipartFile)是非必传参数,即一般情况下需要接受两个参数,分别为pho ... 
- A Bayesian election prediction, implemented with R and Stan
			If the media coverage is anything to go by, people are desperate to know who will win the US electio ... 
- MyBatis_Generator插件的安装以及简单使用
			MyBatis_Generator_1.3.1.zip 1 下载安装包 安装包名称:MyBatis_Generator_1.3.1.zip 2 在Eclipse上进行安装 l ... 
