博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sleep与wait的区别
阅读量:6974 次
发布时间:2019-06-27

本文共 2314 字,大约阅读时间需要 7 分钟。

  hot3.png

sleep与wait的区别:

1、sleep()是Thread类的Static(静态)的方法,不释放对象锁,其他线程无法访问这个对象;

2、wait()是Object类里的方法,线程的执行被挂起,释放对象锁,该对象的其他synchronized方法在wait期间被调用;直到其他对象调用同一对象的notify(notifyAll)方法唤醒等待池中的线程;

3、wait,notify和notifyAll只能放在同步控制方法或同步块里,sleep可以在任何地方使用;

4、sleep必须捕获异常,wait不用

wait,notify和notifyAll为什么只能放在同步控制方法或同步块synchronized里?

只能在同步控制方法和同步控制块调用wait(),因为调用这些方法前必须“拥有“对象的锁,同步方法可以获取对象锁;

Sleep可以在任何地方使用,因为不需要操作对象锁。

package corelesson1;public class TestD {	public static void main(String[] args) {		new Thread(new Thread1()).start();		try {			Thread.sleep(5000);		} catch (Exception e) {			e.printStackTrace();		}		new Thread(new Thread2()).start();	}	private static class Thread1 implements Runnable {		@Override		public void run() {			synchronized (TestD.class) {				System.out.println("enter thread1...");				System.out.println("thread1 is waiting...");				try {					// 调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池31					TestD.class.wait();				} catch (Exception e) {					e.printStackTrace();				}				System.out.println("thread1 is going on ....");				System.out.println("thread1 is over!!!");			}		}	}	private static class Thread2 implements Runnable {		@Override		public void run() {			synchronized (TestD.class) {				System.out.println("enter thread2....");				System.out.println("thread2 is sleep...."); // 只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。48															// TestD.class.notify();															// //==================															// //区别															// //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()															// //方法,则线程永远处于挂起状态。53															// try {															// //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,															// //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。															// //在调用sleep()方法的过程中,线程不会释放对象锁。57				try {					Thread.sleep(5000);				} catch (InterruptedException e) {					e.printStackTrace();				}			}			System.out.println("thread2 is going on....");			System.out.println("thread2 is over!!!");		}	}}

运行效果:

enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!thread1 is going on ....thread1 is over!!!

如果注释掉代码:

1 TestD.class.notify();

运行效果:

enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!

且程序一直处于挂起状态。

转载于:https://my.oschina.net/elain/blog/383806

你可能感兴趣的文章
MFC 添加背景图片并让控件背景透明
查看>>
【语法】NSMutableString的用法
查看>>
python
查看>>
apache2 开源协议
查看>>
JFinal
查看>>
图片跟随鼠标移动
查看>>
使用Java绘制验证码
查看>>
前端知识点总结(html+css)部分
查看>>
docker安装elasticsearch
查看>>
设计模式
查看>>
ACM 擅长排列的小明
查看>>
VI/VIM 编辑器
查看>>
PHPGrid 1.4.8 发布,PHP 的 CRUD 框架
查看>>
Python面向对象关系
查看>>
OpenCV学习(2)--基本数据结构
查看>>
C#写爬虫,版本V2.0
查看>>
03 弹性盒模型
查看>>
a前缀
查看>>
LeetCode第七天
查看>>
ORACLE存储过程 练习系列三 失效或者生效指定表的外键
查看>>