Java中wait和sleep区别

来源:互联网 发布:淘宝店铺排行榜怎么看 编辑:程序博客网 时间:2024/05/01 15:26
  1. super类不同:
    对于sleep()方法是属于Thread类,而wait()方法,则是属于Object类。
  2. 是否释放线程锁 ( ):
    在调用sleep()方法的过程中,线程不会释放对象锁。
    而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
  3. 使用范围:
    wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
  synchronized(x){       x.notify()       //或者wait()  }
  1. 是否捕获异常:
    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();    }}
1 0
原创粉丝点击