Java中sleep()与wait()区别
学习时正好碰到这两个方法,就查阅相关资料,并通过程序实现,进行区别一下:
1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);
2、sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;
以程序说明:
- 
public class MultiThread {
 
- 
 
 
- 
	private static class Thread1 implements Runnable{		
 
- 
		@Override
 
- 
		public void run() {
 
- 
			//由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
 
- 
			//所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
 
- 
			synchronized(MultiThread.class){
 
- 
				System.out.println("enter thread1 ...");
 
- 
				System.out.println("thread1 is waiting");
 
- 
				
 
- 
				try{
 
- 
					//释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
 
- 
					//(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
 
- 
					MultiThread.class.wait();
 
- 
				}catch(InterruptedException e){
 
- 
					e.printStackTrace();
 
- 
				}
 
- 
				
 
- 
				System.out.println("thread1 is going on ...");
 
- 
				System.out.println("thread1 is being over!");
 
- 
			}
 
- 
		}
 
- 
		
 
- 
	}
 
- 
	
 
- 
	private static class Thread2 implements Runnable{
 
- 
		@Override
 
- 
		public void run() {	
 
- 
			//notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
 
- 
			//因为thread2没有释放锁,所以Thread1得不到锁而无法执行
 
- 
			synchronized(MultiThread.class){
 
- 
				System.out.println("enter thread2 ...");
 
- 
				System.out.println("thread2 notify other thread can release wait status ...");
 
- 
				MultiThread.class.notify();
 
- 
				System.out.println("thread2 is sleeping ten millisecond ...");
 
- 
				
 
- 
				try{
 
- 
					Thread.sleep(10);
 
- 
				}catch(InterruptedException e){
 
- 
					e.printStackTrace();
 
- 
				}
 
- 
				
 
- 
				System.out.println("thread2 is going on ...");
 
- 
				System.out.println("thread2 is being over!");
 
- 
			}
 
- 
		}		
 
- 
	}
 
- 
	
 
- 
	public static void main(String[] args) {
 
- 
		new Thread(new Thread1()).start();
 
- 
		try{
 
- 
			Thread.sleep(10);
 
- 
		}catch(InterruptedException e){
 
- 
			e.printStackTrace();
 
- 
		}
 
- 
 
 
- 
		new Thread(new Thread2()).start();
 
- 
	}
 
- 
 
 
- 
}
 
程序运行结果如下图所示
小结:
在面试的时候,我们经常会遇到一个问题:sleep()方法与wait()方法区别。二者的作用都是进行等待。区别在于
1、sleep()方法是Thread对象中定义的方法,而wait()方法定义在Object类中
2、可以在任意地方调用线程对象的sleep方法,但是wait()方法必须位于同步代码块或者同步方法中
3、线程在sleep的时候,并不会释放锁,因此其他线程无法获取到锁,因此也无法执行。而wait方法在执行的时候会释放锁,因此其他线程可以获取到锁,可以有机会运行。
Java中sleep()与wait()区别的更多相关文章
- java中ArrayList 、LinkList区别
		
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
 - java 中 ==和equals 的区别
		
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
 - java中equals和==的区别  (转)
		
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
 - 【转】Java中equals和==的区别
		
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
 - java中a++与++a区别
		
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
 - c#与java中byte字节的区别及转换方法
		
原文:c#与java中byte字节的区别及转换方法 在java中 byte的范围在 [-128,127] 在C#中 byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...
 - java中==与equel的区别
		
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...
 - Java中的“&”和“&&”的区别
		
Java中的"&"和"&&"的区别 1."&"是位运算符,"&&"是逻辑 ...
 - java中PriorityBlockingQueue 和DelayedWorkQueue 区别
		
java中PriorityBlockingQueue 和DelayedWorkQueue 区别
 - Java-杂项: Java中Array和ArrayList区别
		
ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...
 
随机推荐
- SpringCloud核心教程 | 第二篇: 使用Intellij中的maven来快速构建Spring Cloud工程
			
spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环 ...
 - android中常见声音操作方式(Ringtone,SoundPool,MediaPlayer)小结
			
在Android开发中有时候需要用到播放声音操作,在android API 的media包中有三种方式可供我们选择,它们分别是Ringtone,SoundPool,MediaPlayer.因为在我目前 ...
 - 洛谷 P1599 结算日
			
洛谷 P1599 结算日 题目描述 “不放债不借债”,贝西多么希望自己可以遵循这个忠告.她已经和她的N(1 <= N <= 100,000)个朋友有了债务关系,或者借债了,或者放债了.她的 ...
 - java中那些已经有的好用轮子
			
后续补充 IOUtils http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html ...
 - WinXP局域网共享设置
			
关闭局域网共享 1.不允许SAM帐户和共享的匿名枚举(系统默认是允许的). 组策略-计算机配置-Windows 设置-安全设置-本地安全策略-安全选项-网络访问:不允许SAM帐户和共享的匿名枚举. 设 ...
 - (转)iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链
			
转自:http://lesca.me/archives/iptables-examples.html 本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇ipt ...
 - (转)c++ 中的using namespace std是什么意思,什么时候用
			
使用std命名空间 98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题.举一个实例,请注意以下两个头文件: // one.hchar func(char);c ...
 - 数据库中暂时表,表变量和CTE使用优势极其差别
			
1 在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势: 1. 暂时表:分为局部暂时表和全局暂时表. 1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接 ...
 - js进阶课程 12-9 jquery的事件对象event的方法有哪些?
			
js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...
 - bootstrap课程2  bootstrap的栅格系统的主要作用是什么
			
bootstrap课程2 bootstrap的栅格系统的主要作用是什么 一.总结 一句话总结:响应式布局(就是适应不同的屏幕,手机,平板,电脑) 1.bootstrap的栅格系统如何使用? row ...