Java中wait和sleep区别
2016-05-30 09:40
357 查看
super类不同:
对于sleep()方法是属于Thread类,而wait()方法,则是属于Object类。
是否释放线程锁 ( ):
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
使用范围:
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
是否捕获异常:
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
是否释放线程锁的问题:
下面代码中本要实现每输入一次就再输出一次,但由于sleep函数不释放线程锁,所以实现功能失败;
要想实现并且保证同步,只能使用wait,notify函数(释放线程锁)
对于sleep()方法是属于Thread类,而wait()方法,则是属于Object类。
是否释放线程锁 ( ):
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
使用范围:
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){ x.notify() //或者wait() }
是否捕获异常:
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
是否释放线程锁的问题:
下面代码中本要实现每输入一次就再输出一次,但由于sleep函数不释放线程锁,所以实现功能失败;
要想实现并且保证同步,只能使用wait,notify函数(释放线程锁)
class Data{ String name; String sex; } class Input implements Runnable { Data d; int flag = 0; Input(Data da) { this.d = da; } public void run(){ while (true) { synchronized (d) { if (flag == 1) { d.name = "John"; d.sex = "male"; } else { d.name = "Ali"; d.sex = "female"; } flag = (flag + 1)%2; } try{Thread.sleep(1);}catch (Exception e) {} } } class Output implements Runnable { Data d; Output(Data da) { this.d = da; } public void run() { while (true) { synchronized (d) { System.out.println(d.name+ "......" + d.sex); } try{Thread.sleep(1);}catch (Exception e) {} } } } } public class CorrespondenceDemo { public static void main(String[] args) { Data da = new Data(); Thread tA = new Thread(new Input(da)); Thread tB = new Thread(new Output(da)); tA.start(); tB.start(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树