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. .net mvc RazorEngine 字符串razor参数替换

    在.net中有一个比较好的字符串参数替换的方案RazorEngine推荐大家看看原网站,然后做个小联系然后你就懂啦 首先呢得下载一个吧, vs中tools-> Library Paging Ma ...

  2. 菜农群课笔记之ICP与ISP----20110412(整理版)

    耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html        成 ...

  3. URL中#(井号)的作用(转)

    2010年9月,twitter改版. 一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为 http://twitter.com/username 改版后,就变 ...

  4. 使用libcurl POST数据和上传文件

    为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度.fc也可以是任何其它内容.curl 是 libcurl句柄.演示省略了很多显而易见的步骤.   1. 普通的post请求,这里用c ...

  5. 参照openRTSP写的一个RTSP client 加了一些注解

    #include "liveMedia.hh"  #include "BasicUsageEnvironment.hh"  #include "Gro ...

  6. Jsp、Servlet

    1 forward.redirect forward 转发是服务器行为,浏览器根本不知道服务器发送的内容是从哪儿来,所以它的地址栏中还是原来的地址. redirect 重定向是客户端行为.redire ...

  7. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  8. 如何让Table显示滚动条

    Table显示滚动条,要先把table放到一个div中,div的长度和宽度要固定,控制overflow属性为scroll <div style="width:700px; height ...

  9. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  10. ThinkPHP - 组织分类结构