多线程系列第(二)篇---sleep和wait

相同点

使当前线程进入阻塞状态

不同点

a. sleep是Thread类的方法,wait是Object类的方法
b. sleep可以在任意地方使用,wait因为会对对象的“锁标志”进行操作,所以只能在synchronized方法或者synchronized块中使用
c. sleep不会释放对象锁,而wait在暂停的同时会释放对象锁
d. sleep在休眠一段时间后自动苏醒,wait有两种方式,无参数的和有一个时间参数的,其中无参数的需要调用notify或者notifyAll主动唤醒。有参数的在超时后也会自动苏醒

sleep代码示例

public class SleepDemo {

public void methodA() {
    synchronized (this) {
        System.out.println("A begin time=" + System.currentTimeMillis());
        try {
            Thread.sleep(2000);  //不会释放对象锁
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("A end   time=" + System.currentTimeMillis());
    }
}

public void methodB() {
    synchronized (this) {
        System.out.println("B begin time=" + System.currentTimeMillis());
        System.out.println("B end   time=" + System.currentTimeMillis());
    }
}

class ThreadA extends Thread {

    private SleepDemo sleepDemo;

    public ThreadA(SleepDemo sleepDemo) {
        this.sleepDemo = sleepDemo;
    }

    public void run() {
        sleepDemo.methodA();
    }
}

class ThreadB extends Thread {

    private SleepDemo sleepDemo;

    public ThreadB(SleepDemo sleepDemo) {
        this.sleepDemo = sleepDemo;
    }

    public void run() {
        sleepDemo.methodB();
    }
}

public static void main(String[] args) {
    SleepDemo sleepDemo = new SleepDemo();
    ThreadA a = sleepDemo.new ThreadA(sleepDemo);
    ThreadB b = sleepDemo.new ThreadB(sleepDemo);
    a.start();
    b.start();
}

运行结果
A begin time=1507623420839
A end   time=1507623422840
B begin time=1507623422840
B end   time=1507623422840

wait代码示例

public class WaitDemo {
  public void methodA() {
    synchronized (this) {
        System.out.println("A begin time=" + System.currentTimeMillis());
        try { 
            wait(2000);    //会释放对象锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("A end   time=" + System.currentTimeMillis());
    }
}

public void methodB() {
    synchronized (this) {
        System.out.println("B begin time=" + System.currentTimeMillis());
        System.out.println("B end   time=" + System.currentTimeMillis());
    }
}

class ThreadA extends Thread {

    private WaitDemo sleepDemo;

    public ThreadA(WaitDemo sleepDemo) {
        this.sleepDemo = sleepDemo;
    }

    public void run() {
        sleepDemo.methodA();
    }
}

class ThreadB extends Thread {

    private WaitDemo sleepDemo;

    public ThreadB(WaitDemo sleepDemo) {
        this.sleepDemo = sleepDemo;
    }

    public void run() {
        sleepDemo.methodB();
    }
}

public static void main(String[] args) {
    WaitDemo sleepDemo = new WaitDemo();
    ThreadA a = sleepDemo.new ThreadA(sleepDemo);
    ThreadB b = sleepDemo.new ThreadB(sleepDemo);
    a.start();
    b.start();
  }
}

运行结果
A begin time=1507623587359
B begin time=1507623587360
B end   time=1507623587360
A end   time=1507623589363

你可能感兴趣的:(多线程系列第(二)篇---sleep和wait)