当前位置: 首页 > news >正文

Java中sleep和wait的区别

 sleep()、suspend()、resume()方法不推荐使用,推荐使用wait()、notify()、notifyAll()。

    sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
        (a)“醒来”的线程具有更高的优先级。  
  (b)正在运行的线程因为其它原因而阻塞。 
 
   wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
     当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
     waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

 

 

 

 1、这两个方法来自不同的类分别是Thread和Object

  2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

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

  任何地方使用(使用范围)

  synchronized(x){

  x.notify()

  //或者wait()

  }

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

  扩充阅读:

  java 线程中的sleep和wait有一个共同作用,停止当前线程任务运行,但他们存在一定的不同,首先我们先看sleep中的构造函数

  sleep(long millis)           Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.

  sleep(long millis, int nanos)          Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.

  sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

  注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程

  wait方法

  void wait(long timeout)

  Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

  void wait(long timeout, int nanos)

  Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

  wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生

  InterruptedException,效果以及处理方式同sleep()方法

  追加内容:

  Collection是个java.util下的接口,它是各种集合结构的父接口。

  Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

  Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

  collections 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。 如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都会抛出 NullPointerException。

相关文章:

  • iOS的一些面试题分析总结(1)
  • sql中的group by
  • java的finally语句
  • 各种编程语言变量的数据类型
  • java解惑你知多少(一)
  • 《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体...
  • java解惑你知多少(二)
  • lnmp的使用
  • java解惑你知多少(三)
  • linux挂载windows共享文件夹
  • java解惑你知多少(四)
  • Android selector的使用
  • java解惑你知多少(五)
  • 快速傅里叶变换FFT学习小记
  • java解惑你知多少(六)
  • 「面试题」如何实现一个圣杯布局?
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Bootstrap JS插件Alert源码分析
  • C++入门教程(10):for 语句
  • Javascript编码规范
  • Lsb图片隐写
  • MaxCompute访问TableStore(OTS) 数据
  • Python学习之路13-记分
  • 深入 Nginx 之配置篇
  • 使用Gradle第一次构建Java程序
  • 用简单代码看卷积组块发展
  • 转载:[译] 内容加速黑科技趣谈
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Spring第一个helloWorld
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (175)FPGA门控时钟技术
  • (JS基础)String 类型
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)WCF的Binding模型
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)MySQL的备份及恢复
  • (译) 函数式 JS #1:简介
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)可以带来幸福的一本书
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net 4.0发布后不能正常显示图片问题
  • .NET 回调、接口回调、 委托
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 指南:抽象化实现的基类
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [20190401]关于semtimedop函数调用.txt
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [exgcd] Jzoj P1158 荒岛野人
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [HDOJ4911]Inversion