sleep()和wait()有什么区别?


参考答案
  • sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法
  • sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
  • sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
  • JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常

 

测试代码

public class TestWaitSleep {
 
	private static Object obj = new Object();
	
	public static void main(String[] args) {
		
		//测试sleep()
		//测试 RunnableImpl1 wait(); RunnableImpl2 notify()
		Thread t1 = new Thread(new RunnableImpl1(obj));
		Thread t2 = new Thread(new RunnableImpl2(obj));
		t1.start();
		t2.start();
		
		//测试RunnableImpl3 wait(long timeout)方法
		Thread t3 = new Thread(new RunnableImpl3(obj));
		t3.start();
	}
 
	
}
 
class RunnableImpl1 implements Runnable {
 
	private Object obj;
	
	public RunnableImpl1(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImpl1");
		synchronized (obj) {
			System.out.println("obj to wait on RunnableImpl1");
			try {
				obj.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("obj continue to run on RunnableImpl1");
		}
	}
}
 
class RunnableImpl2 implements Runnable {
 
	private Object obj;
	
	public RunnableImpl2(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImpl2");
		System.out.println("睡眠3秒...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		synchronized (obj) {
			System.out.println("notify obj on RunnableImpl2");
			obj.notify();
		}
	}
}
 
class RunnableImpl3 implements Runnable {
 
	private Object obj;
	
	public RunnableImpl3(Object obj) {
		this.obj = obj;
	}
	
	public void run() {
		System.out.println("run on RunnableImpl3");
		synchronized (obj) {
			System.out.println("obj to wait on RunnableImpl3");
			try {
				obj.wait(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("obj continue to run on RunnableImpl3");
		}
	}
}

打印结果

run on RunnableImpl2
睡眠3秒...
run on RunnableImpl1
obj to wait on RunnableImpl1
run on RunnableImpl3
obj to wait on RunnableImpl3
obj continue to run on RunnableImpl3
notify obj on RunnableImpl2
obj continue to run on RunnableImpl1

 


微信小程序

  • 基础与语法
    • JDK和JRE有什么区别?
    • ==和equals的区别是什么?
    • 基本类型和包装类对象使用 == 和 equals进行比较的结果?
    • 什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?
    • hashCode()相同,equals()也一定为true吗?
    • final在java中的作用
    • final finally finalize()区别
    • finally语句块一定执行吗?
    • final与static的区别
    • return与finally的执行顺序对返回值的影响
    • String对象中的replace和replaceAll的区别?
    • Math.round(-1.5) 等于多少?
    • String属于基础的数据类型吗?
    • java中操作字符串都有哪些类?它们之间有什么区别?
    • 如何将字符串反转?
    • String类的常用方法有哪些?
    • 普通类和抽象类有哪些区别?
    • 抽象类必须要有抽象方法吗?
    • 抽象类能使用final修饰吗?
    • 接口和抽象类有什么区别?
    • Java访问修饰符有哪些?权限的区别?
    • Java中的 << << >>> 是什么?
    • javap的作用是什么?
    • throw和throws的区别?
    • try-catch-finally中哪个部分可以省略?
    • 常见的异常类有哪些?
    • 什么是JAVA内部类?
    • nio中的Files类常用方法有哪些?
    • 什么是反射?有什么作用?
    • 动态代理是什么?应用场景?
    • 怎么实现动态代理?
    • 什么是java序列化?什么情况下需要序列化?
    • 什么场景要对象克隆?
    • 深拷贝和浅拷贝区别是什么?
    • 如何实现对象克隆与深拷贝?
    • Java跨平台运行的原理
    • Java的安全性体现在哪里?
    • Java针对不同的应用场景提供了哪些版本?
    • 什么是JVM?
    • 什么是JDK?
    • 什么是JRE?
    • JDK、JRE、JVM之间的关系是什么样的?
    • Java语言有哪些注释的方式?
    • Java中有几种基本数据类型?它们分别占多大字节?
    • i++和++i的作用和区别
    • &和&&的作用和区别
    • |和||的作用和区别
    • 如何让计算机最高效的算出2乘以8?
    • Java中基本类型的转换规则
    • if-else-if-else与switch的区别
    • while和do-while的区别
    • break语句的作用
    • continue语句的作用
    • Java中数组有什么特征?
    • 可变参数的作用和特点是什么?
    • 类和对象的关系
    • 说一说你的对面向过程和面向对象的理解
    • 方法重载和重写是什么?有什么区别?
    • this和super关键字的作用
    • static关键字的作用是什么?
    • abstract关键字的作用是什么?
    • java.lang.Object的常用方法?
    • 子类构造方法的执行过程是什么样的?
    • ==和equals的区别是什么?
    • 什么是Java的多态?
    • instanceof关键字的作用是什么?
    • 什么是Java的垃圾回收机制?
    • 什么是包装类?为什么要有包装类?基本类型与包装类如何转换?
    • 基本类型和包装类的区别?
    • java.sql.Date和java.util.Date的区别
    • 关于Java编译,下面哪一个正确()
    • 关于构造方法,下列说法正确的是()
    • Java中接口的修饰符可以是()
    • 以下代码将输出()
    • 关于关键字的使用说法错误的是()
    • 关于内存回收正确的是()
    • 哪些标识符合法?
    • 说法正确的是()
    • 定义一个Java类,可被所有类访问,申明正确的是()
    • 说说你对面向对象的理解
    • 内存泄漏和内存溢出的区别
    • 不通过构造方法能创建对象吗?
    • 匿名内部类可以继承类或实现接口吗?为什么?
    • 什么是多态?如何实现?有什么好处?
    • Java中关于继承,错误的是()
    • Math.random()的返回值是多少?
    • 同步代码块和同步方法有什么区别?
    • 内部类和静态内部类有什么区别?
    • 下列运算符合法的是()
    • 打印值是多少?
    • 关于抽象,正确的是()
    • 正确的是()
    • 正确的是()
    • 错误的是()
    • 哪些不能修饰 interface
    • 正确是的()
    • 存在i+1< i的数吗?为什么?
    • 接口可否继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?
    • 可序列化对象为什么要定义serialversionUID值?
    • 十进制100转换成八进制是多少?
    • Class类的getDeclaredFields()与getFields()方法的区别?
    • final修饰变量,是引用不能变?还是引用的对象不能变?
    • 解释以下正则表达式的含义
    • 声明合法的是()
    • 下面打印结果是?
    • Java属于编译型还是解释型语言?
    • 如果有两个类A、B(注意不是接口),如何编写C类同时使用这两个类的功能?
    • 构造方法是否可以被重载?重写?
    • 基本类型byte表示的数值范围是多少?
    • 日期类型如何格式化?字符串如何转日期?
    • 当输入为2的时候返回值是
    • System.out.println('a'+1);的结果是
    • 静态与非静态成员变量区别?
    • 二进制数,小数点向右移一位,值会发生什么变化?
    • 下面两段代码的区别是?
    • swtich能否作用在byte、long、String上?
    • 在Java 中,如何跳出当前的多重嵌套循环?
    • 为什么不能根据返回类型来区分方法重载?
    • Inner Class和Static Nested Class的区别?
    • abstract方法是否可是static的?native的?synchronized的?
    • 静态方法内部能对非静态调用吗?
    • 内部类可以引用它的外部类的成员吗?有什么限制?
    • 打印结果是什么
    • 说说字符串与基本数据之间的转换
    • GB2312编码的字符串如何转换为ISO-8859-1编码?
    • Java中的日期与时间获取与转换?
    • 反射主要实现类有哪些?
    • Class类的作用是什么?如何获取Class对象?
    • 面向对象设计原则有哪些?
    • 反射的使用场景、作用及优缺点?
    • 下面代码的输出是?
    • 关于String[] strArr=new String[10];正确的是()
    • 写一个方法实现String类的replaceAll方法
    • String类是否可以继承?
    • String、StringBuilder、StringBuffer的区别?
    • 为什么String类被设计用final修饰?
    • String s = new String("xyz");创建几个String对象?
    • String s="a"+"b"+"c"+"d";创建了几个对象?
    • 对比一下Java和JavaSciprt
    • 什么是assert?
  • 集合
    • java 有哪些常用容器(集合)?
    • ArrayList和Vector的联系和区别
    • Collection和Collections有什么区别?
    • List、Set、Map 之间的区别是什么?
    • HashMap和Hashtable 有什么区别?
    • 如何决定使用HashMap还是TreeMap?
    • ArrayList和LinkedList的区别是什么?
    • Array和ArrayList有何区别?
    • 如何实现数组和List之间的转换?
    • Queue的add()和offer()方法有什么区别?
    • Queue的remove()和poll()方法有什么区别?
    • Queue的element()和peek()方法有什么区别?
    • 哪些集合类是线程安全的?
    • 迭代器Iterator是什么?
    • Iterator怎么使用?有什么特点?
    • Iterator和 ListIterator有什么区别?
    • 怎么确保一个集合不能被修改?
    • 为什么基本类型不能做为HashMap的键值?
    • HashMap的键值需要注意什么?
    • Java中已经数组类型,为什么还要提供集合?
    • TreeSet的原理是什么?使用需要注意什么?
    • HashSet实现原理是什么?有什么特点?
    • 正确的是()
    • HashSet和HashMap有什么区别?
    • ArrayList list=new ArrayList(10);中的list扩容几次?
    • List、Set、Map哪个继承自Collection接口?
    • ArrayList与LinkedList哪个插入性能高?
    • LinkedHashMap、LinkedHashSet、LinkedList哪个最适合当作Stack使用?
    • Map的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性?
    • TreeMap和TreeSet在排序时如何比较元素?
    • Collections工具类中的sort方法如何比较元素?
    • List里如何剔除相同的对象?
    • Java.util.Map的常用实现类有哪些?
    • List、Set、Map 是否继承自 Collection 接口?
    • Vector、ArrayList、LinkedList 的存储性能和特性?
    • List、Map、Set 三个接口,存取元素时,各有什么特点?
  • 网络编程
    • java中IO流有哪些?
    • BIO、NIO、AIO有什么区别?
    • tcp和udp的区别?
    • tcp为什么要三次握手,两次不行吗?为什么?
    • tcp粘包是怎么产生的?
    • OSI的七层模型有哪些?
    • 面向字符的输入流是()
    • 如何读取文件a.txt中第10个字节?
    • 关于流的创建,错误的是()
    • JDK中什么类可以通过流写入数据到内存?
    • 如何将字符串写入文件?
    • 输入流和输出流的区别
    • 列举常用字节输入流和输出流
    • 节点流和处理流区别
    • 字节流和字符流区别与适用场景
    • 缓冲流的优缺点
    • Java实现文件夹复制
    • Java中的Socket是什么?
    • 基于TCP和UDP的Socket编程的主要步骤
  • 并发
    • 并行是什么意思?与并发的区别是什么?
    • 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
    • 什么是守护线程?
    • 如何创建、启动 Java 线程?
    • 什么是并发编程?
    • 为什么要用并发编程?
    • 并发编程的缺点?
    • 导致并发程序出问题的根本原因是什么?
    • Java 程序中怎么保证多线程的运行安全?
    • 如何优雅地停止一个线程?
    • 线程包括哪些状态?状态之间是如何变化的?
    • 什么是线程池?
    • 线程池包含哪些状态?
    • Executors创建线程池有哪几种方式?
    • 如何停止一个线程池?
    • synchronized关键字的作用是什么?
    • volatile关键字的作用是什么?
    • Java中的锁是什么?
    • 锁如何使用?有什么注意事项?
    • 可重入锁与不可重入锁之间的区别与性能差异?
    • Java中的锁之间的区别是什么?
    • synchronized锁的升级原理是什么?
    • 什么是死锁?
    • 如何避免死锁?
    • 什么是活锁和饥饿?
    • Java中有哪些无锁技术来解决并发问题?如何使用?
    • 什么是 Java 内存模型?
    • 什么是 happens-before 原则?
    • sleep()和wait()有什么区别?
    • Runnable和Callable有什么区别?
    • notify()和notifyAll()有什么区别?
    • 线程池中submit()和execute()方法有什么区别?
    • ThreadLocal有什么作用?有哪些使用场景?
    • synchronized和volatile的区别是什么?
    • synchronized和Lock有什么区别?
    • synchronized和ReentrantLock区别是什么?
    • ReadWriteLock如何使用?
    • JDK中Atomic开头的原子类实现原子性的原理是什么?
    • 介绍一下ForkJoinPool的使用
    • LongAdder与AtomicLong有什么区别?
    • 乐观锁与悲观锁是什么?
    • 使用对象的wait()方法需要注意什么?
    • 哪种方式不会使线程进入阻塞状态()
    • volatile关键字能否保证线程安全?
    • 如何保证多个线程同时启动?
    • 同步和异步有何异同,分别在什么情况下使用?
    • 创建进程需要()
    • sleep()和yield()有什么区别?
    • 说说与线程相关的方法
    • 线程的run()方法和start()方法有什么区别?
    • 说说对于sychronized同步锁的理解
    • Java中实现线程通信方式有哪些?
    • JavaScript中null、undefined有什么区别?
  • WEB
    • jsp和servlet有什么区别?
    • jsp有哪些内置对象?作用分别是什么?
    • jsp的4种作用域?
    • session和cookie有什么区别?
    • session的工作原理?
    • 客户端禁止cookie,session还能用吗?
    • http响应码301和302代表的是什么?有什么区别?
    • forward和redirect的区别?
    • get和post请求有哪些区别?
    • 如何实现跨域?
    • 什么是JSONP?
    • HTML、CSS、Javascript在Web开发中的作用?
    • body中的onload事件和document.ready()有什么区别?
    • 写一些常见的Javascript正则表达式?
    • Javascript正则表达式使用方式有哪些?
    • jQuery中有哪些选择器?
    • div居中和内容居中的css属性设置
    • Servlet中的doPost和doGet方法有什么区别?传递和获取参数上有什么区别?
    • jQuery中get与eq方法的区别
    • 如何配置一个servlet?
    • JavaScript如何定义含有数值1至3的数组?
    • 常见的HTTP协议状态码?
  • 安全
    • 如何避免sql注入?
    • 什么是XSS攻击,如何避免?
    • 什么是CSRF攻击,如何避免?
  • 设计模式
    • 常用的设计模式有哪些?
    • 简单工厂和抽象工厂有什么区别?
    • 为什么Java中一个类可以实现多个接口,但只能继承一个类?
    • 什么是UML?
  • 框架
    • 为什么要使用spring框架?
    • 什么是aop?
    • 什么是ioc?
    • spring有哪些主要模块?
    • spring常用的注入方式有哪些?
    • spring中的bean是线程安全的吗?
    • spring支持几种bean的作用域?
    • spring自动装配bean有哪些方式?
    • spring事务实现方式有哪些?
    • 介绍一下spring mvc
    • spring mvc运行流程?
    • spring mvc有哪些组件?
    • @RequestMapping的作用是什么?
    • @Autowired的作用是什么?
    • 什么是spring boot?为什么要用?
    • spring boot核心配置文件是什么?
    • spring boot有哪些方式可以实现热部署?
  • 数据结构与算法
    • 递归计算n!
    • 什么是递归?递归的优缺点是什么?
    • 什么是复杂度?为什么要进行复杂度分析?
    • 什么是时间复杂度?什么是空间复杂度?
    • 如何进行复杂度分析?
    • 使用递归输出某个目录下所有子目录和文件
    • 常见加密算法有哪些?是否对称?
    • 合并两个有序的链表
    • 单向链表的反转
    • 一个不包含相同元素的整数集合,返回所有可能的不重复子集集合
    • 正确的是()
    • 统计某字符串在文件中出现的次数
    • 统计一段长字符串中某字符串的出现次数
  • 异常
    • 列举一些列举常见的运行时异常
    • OutOfMemoryError的原因有哪些?怎么解决?
    • Unsupported major.minor version 52是什么造成的,如何解决?
    • Java中如何进行异常处理?throws、throw、try、catch、finally分别如何使用?
    • 运行时异常与受检异常有何异同?
    • 异常的设计原则有哪些?
  • 文件解析与生成
    • Java中有哪些解析XML的类库?有什么特点?
    • 解析xml的方式有哪些?如何选择?
    • XML 文档定义有几种形式?有何区别?
    • 解析XML文档有哪些种方式?
    • XML的使用场景有哪些?
  • linux
    • 什么是Linux?
    • linux如何添加新系统用户?
    • 什么是bash别名?
    • 什么是linux内核?包括哪些模块?
    • linux指令-ls
    • linux指令-cd
    • linux指令-pwd
    • linux指令-mkdir
    • linux指令-rm
    • linux指令-rmdir
    • linux指令-mv
    • linux指令-cp
    • linux指令-cat
    • linux指令-more
    • linux指令-less
    • linux指令-tail
    • linux指令-head
    • linux指令-which
    • linux指令-whereis
    • linux指令-locate
    • linux指令-find
    • linux指令-chmod
    • linux指令-tar
    • linux指令-chown
    • linux指令-df
    • linux指令-du
    • linux指令-ln
    • linux指令-date
    • linux指令-cal
    • linux指令-grep
    • linux指令-wc
    • linux指令-ps
    • linux指令-top
    • linux指令-kill
    • linux指令-free
  • MySQL
    • 如何创建和删除数据库?
    • MyISAM与InnoDB的区别?
    • char与varchar的区别
    • 建表语句中varchar(50)中50的指是什么?
    • int(10)中10指什么?