1、二者的来源

  sleep(),是Thread下面的静态方法/静态本地方法。

  wait(),是Object()的final方法。

 2、源码分析

  a、sleep()

  public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
} sleep(millis);
}

    当调用sleep(millis,nanos)的时候,内部调用的sleep(mills),如下:

public static native void sleep(long millis) throws InterruptedException;

  这是一个静态的本地方法

  由一句话比较重要::: The thread does not lose ownership of any monitors.调用该方法的线程不会失去任何的监控。 不会失去该线程原来拥有的所有锁。

  实例:

  一个实体类User

 public class User {
private int age; public int getAge() {
return age;
} @Override
public String toString() {
return "User [age=" + age + "]";
} public void setAge(int age) {
this.age = age;
} }

  对该实体类的操作

 public class Main {

     public static void main(String[] args) {

         final User user = new User();
user.setAge(10); synchronized (user) {
try {
System.out.println("当前线程 <---->"
+ Thread.currentThread().getName() + "<-----> 准备休眠"); Thread.sleep(10000);// 当前线程休眠 System.out.println("当前线程 <---->"
+ Thread.currentThread().getName() + "<-----> 完成休眠"); // 创建新的线程,对当前持锁对象执行相关操作
new Thread("new thread") {
public void run() {
System.out.println("当前线程 --->"
+ Thread.currentThread().getName());
System.out.println(user.getAge());
};
}.start(); } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

  执行结果:

当前线程  <---->main<-----> 准备休眠
当前线程 <---->main<-----> 完成休眠
当前线程 ---> new thread
10

 所以当在一个synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。所以只有在synchronized 块结束的时候,线程才会释放相应的锁。

  b、wait()

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits 
until another thread notifies threads waiting on this object's monitor to wake up

  调用该方法的线程必须要拥有对象的控制权。调用之后,就会释放控制权,直到被其他的线程唤醒(notify() | notifyAll()) 。

The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

  之后,被唤醒的线程就继续等待,直到 重新获取对象的控制权。

   public final void wait() throws InterruptedException {
wait(0);
}

  调用wait(0)方法--final native

  public final native void wait(long timeout) throws InterruptedException;

  The specified amount of real time has elapsed, more or less.  If timeout is zero, however, then real time is not taken into consideration and the thread simply waits until notified.Then removed from the wait set for this object and re-enabled for thread scheduling. 到达wait时间或者被唤醒(还有一种被唤醒的方式--spurious wakeup,详细可以查看相关API),就会从线程的wait set中移除,等待重新被调度。

    

                      欢迎拍砖

Java -- sleep and wait的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  10. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

随机推荐

  1. IOS 定位服务与地图的应用开发

    1.定位服务 现在的移动设备很多都提供定位服务,IOS设备提供3种不同定位途径: (1)WiFi定位,通过查询一个WiFi路由器的地理位置的信息,比较省电:IPhone,IPod touch和IPad ...

  2. 深究带PLL的错误复位设计

    PLL复位通常犯的错误 或者是像上一篇文章 FPGA知识大梳理(四)FPGA中的复位系统大汇总  中的图一样,也是错误设计.为何呢?看ALTPLL (Phase-Locked Loop) IP Cor ...

  3. setTimeout 虚假的“异步”

    看这篇http://www.laruence.com/2009/09/23/1089.html 所以实际上 setTimeout更像是任务按照队列执行  经过setTimeout设置后任务放在了队尾 ...

  4. 如何管理安卓android手机下google(谷歌)的通讯录联系人账户

    andorid手机都自带通讯录备份功能,但是如何管理,一直是一些人头疼的问题.经常在手机备份还原之后发现很多联系人都有重复. 1.打开 :https://mail.google.com/ 用你的谷歌账 ...

  5. 别忘记给你博客的windows live writer配置 ping服务

    写好一篇博客,想要实现秒收.就必须要为文章添加ping服务. 这里介绍一下给wlw添加ping服务的办法. 点击工具---选项--ping服务器. 在右侧栏中加入以下地址 http://rpc.pin ...

  6. 电子标签(RFID)天线的印制技术

    电子标签是射频识别(RFID)的俗称,RFID是射频识别技术的英文(RadioFrequencyIdentification)缩写,射频识别技术是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无 ...

  7. adb shell dumpsys 命令 查看内存

    android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 n ...

  8. 基于表单的身份验证(FBA)

    https://technet.microsoft.com/zh-cn/library/ee806890(office.15).aspx http://www.tuicool.com/articles ...

  9. MemberShip使用大全

    比较全面的membership 使用过程 http://www.cnblogs.com/xlb2000/archive/2010/07/31/1788120.html Membership中创建的数据 ...

  10. VisualSVN Server安装后,TortoiseSVN远程无法访问版本库。

    修正!重演了一遍,发现总结有误,重新整理下.首先访问版本库的路径不清楚的话可以在VisualSVN Server的版本库上右键“Copy URL to Clipboard”.访问版本库失败的几种情况: ...