sleep()方法和wait()方法的区别

1、来源不同:

sleep()方法来自于 Thread 类的一个静态方法, 只有继承了线程类的子类才能调用该方法,且谁调用的谁去睡觉,即使在 A 线程里调用了 B 的sleep方法,实际上还是 A 去睡觉,要让 B 线程睡觉要在 B 的代码中调用sleep。

1 static void sleep(long millis);  //在指定的毫秒数内对当前正在执行的线程进行休眠操作
2 static void sleep(long millis,  int nanos);  //在指定的毫秒加纳秒内对当前执行线程进行休眠操作

  wait()方法来自于 Object 类,Object类所有Java类的祖先。所以任何一个类都可以调用wait()方法。

1 void wait();  //在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
2 void wait(long timeout);  //在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,导致该线程等待3 void wait(long timeout,  int nanos);  //在其他线程对用此对象的notify()方法或notifyAll()方法,或者其他某个线程终端当前线程,或者已超出某个实际时间量前,当前线程等待

2、最主要是sleep()方法没有释放锁,而 wait() 方法释放了锁,使得其他线程可以使用同步控制块或者方法。就如同蹲坑,就算在马桶上睡着了也不让出这个坑,你睡醒了还可以继续,这就是sleep();拉到一半被boss换出去,让出资源,这就是wait(),决定你再次蹲上这个坑的是boss的唤醒。

所以通常可以描述为 sleep 不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用 notify/notifyAll 唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。 sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

   synchronized(x){
      x.notify();
     //或者wait()
   }

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

sleep()方法和wait()方法的区别

时间: 2024-09-29 11:24:46

sleep()方法和wait()方法的区别的相关文章

详解HTTP请求:get方法和post方法的区别

在讨论get方法和post方法的区别时,我们经常会提到两点: 1.get传送的数据量较小,不能大于2KB,而post传送的数据量较大,一般被默认为不受限制: 2.get安全性非常低,但是post安全性较高: 究其根本,为什么呢?就需要提到http报文以及http报文的格式. 首先我们先看一下HTTP请求报文的通用格式: 在<计算机网络--自顶向下方法>一书中提到很关键的两句话: 使用get方法时实体主体为空,而使用post方法时才使用. HTML表单经常使用GET方法,将输入数据(在表单字段)

2016/05/23 thinkphp M方法和D方法的区别

M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 M方法: 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时 只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用 M方法 甚至可以简单看着就是对参数表名对应的数据表的操作: $User = M('User'); 使用D方法 如果是如下情况,请考虑使

jquery中prop()方法和attr()方法的区别

jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时候可以取到值,值为"checked"但没选中获取值就是un

问题:ExecuteNonQuery 与 ExecuteScalar 结果: ExecuteNonQuery方法和ExecuteScalar方法的区别

ExecuteNonQuery方法和ExecuteScalar方法的区别 ----ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加.删除和更新),那么方法将返回操作所影响的记录条数. ----ExecuteScalar():执行命令对象的SQL语句,如果SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略 其他的行 和列.该方法所返回的结果为object类型,在使用之前必须强制转换为所

ExtJS中listener方法和handler方法的区别

listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过处理函数一次处理点击响应 Ext.create('Ext.Button', { text : 'Dynamic Handler Button', renderTo: Ext.getBody(), handler : function() { // this button will spit out

ThinkPHP的D方法和M方法的区别

M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 M方法: 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用M方法 甚至可以简单看着就是对参数表名对应的数据表的操作: $User = M('User'); 使用D方法 如果是如下情况,请考虑使用

HTTP PUT方法和POST方法的区别

POST 方法用来传输实体的主体,PUT方法用来传输文件,自身不带验证机制. 这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别.事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性.那这又衍生出一个问题,什么是幂等? 幂等(idempotent.idempotence)是一个抽象代数的概念.在计算机中,可以这么理解,一个幂

prop()方法和attr()方法的区别

prop()方法和attr()方法的区别:关于这两个方法的具体用法这里就不多介绍了,可以参阅prop()和attr()方法相关手册即可.这两个方法作用好像是一模一样,其实绝大多数作用都是一样,只有在一些特殊的情况下才有可能出现一些差异,下面就结合实例实例介绍一下在这两个方法的区别.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name=&q

sleep()方法和wait()方法的区别? sleep()方法和yield()方法的区别?

sleep()方法和wait()方法的区别? sleep方法是Thread的静态方法,wait方法是Object类的普通方法 sleep方法不释放同步锁,wait方法释放同步锁(执行notify方法唤醒wait的线程时是不释放同步锁的) wait方法用于线程间通信,而sleep方法用于短暂的暂停线程 sleep针对当前线程,而wait针对被同步代码块加锁的对象 sleep方法是当前线程暂停指定时间,将执行机会让给其它线程,时间结束后进入就绪状态等待 调用wait方法会暂停线程,当前线程释放对象的