- 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();
}
}