Java -- sleep and wait

 1、二者的来源

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

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

 2、源码分析

  a、sleep()

 1  public static void sleep(long millis, int nanos)
 2     throws InterruptedException {
 3         if (millis < 0) {
 4             throw new IllegalArgumentException("timeout value is negative");
 5         }
 6
 7         if (nanos < 0 || nanos > 999999) {
 8             throw new IllegalArgumentException(
 9                                 "nanosecond timeout value out of range");
10         }
12         if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
13             millis++;
14         }
15
16         sleep(millis);
17     }

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

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

  这是一个静态的本地方法

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

  实例:

  一个实体类User

 1 public class User {
 2     private int age;
 3
 4     public int getAge() {
 5         return age;
 6     }
 7
 8     @Override
 9     public String toString() {
10         return "User [age=" + age + "]";
11     }
12
13     public void setAge(int age) {
14         this.age = age;
15     }
16
17 }

  对该实体类的操作

 1 public class Main {
 2
 3     public static void main(String[] args) {
 4
 5         final User user = new User();
 6         user.setAge(10);
 7
 8         synchronized (user) {
 9             try {
10                 System.out.println("当前线程  <---->"
11                         + Thread.currentThread().getName() + "<-----> 准备休眠");
12
13                 Thread.sleep(10000);// 当前线程休眠
14
15                 System.out.println("当前线程  <---->"
16                         + Thread.currentThread().getName() + "<----->  完成休眠");
17
18                 // 创建新的线程,对当前持锁对象执行相关操作
19                 new Thread("new thread") {
20                     public void run() {
21                         System.out.println("当前线程  --->"
22                                 + Thread.currentThread().getName());
23                         System.out.println(user.getAge());
24                     };
25                 }.start();
26
27             } catch (InterruptedException e) {
28                 // TODO Auto-generated catch block
29                 e.printStackTrace();
30             }
31         }
32     }
33 }

  执行结果:

当前线程  <---->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.

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

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

  调用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中移除,等待重新被调度。

    

                      欢迎拍砖

时间: 2024-10-05 19:08:26

Java -- sleep and wait的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java自学序言

Java自学序言 亲爱的自己和各位读者朋友: 您们好! 这是作者本人自学Java编程开发的一系列文章,不具有一定的权威性,也算是自己一个人的学习笔记和总结,希望自己通过博客的形式将我自己的学习效率得到提高.如自学的稳重存在不足或错误的地方希望广大的博客朋友们多多指教.本人在此不胜感激! 学习Java是一件很痛苦的事儿,我自己要想不断的去挑战一下自己,把自己大学所学的Java知识能够巩固起来.不断的去改正自己开发中的不足之处.如何来学习Java?如何来更好的掌握Java开发语言?这些都是我们要不断

接口测试(java+testng+ant+jenkins)第五篇 java二

1.数据代码分离,方便维护. 一般做法是将数据保存在excel,通过程序读取. 2.读取excel数据. 在D盘新建excel,A列放url,B列放参数. 新建class redExcel package com.lx; import java.io.File; import java.io.IOException; import jxl.*; import jxl.read.biff.BiffException; public class redExcel{ public static voi