您的位置:首页 > 编程语言 > Java开发

Java中wait和sleep区别

2016-05-30 09:40 357 查看
super类不同:

对于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 线程 sleep wait