>关于本文

本文介绍sleep()、wait()、notify()、notifyAll()方法,主要要理解:

  1. sleep()和wait()的区别。
  2. wait()与notify()、notifyAll()之前互相协调的关系。
  3. notify()与notifyAll()的区别。

 

> Thread.sleep(long),睡眠指定时间

此方法是让线程睡眠指定时间不释放锁(睡觉,当然要上锁,这个还用说么)。

此方法我貌似很少用,又似乎很常用。因为,在正式代码中我很少用到,而在测试代码中,却又经常用来模拟某某业务需时几秒的阻塞。

public class Sleep {

    public static void main(String[] args) {
        
        System.out.println("Start...");
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("End...");

    }

}

 

一般,还有个更易读的写法,一样的效果

import java.util.concurrent.TimeUnit;


public class Sleep {

    public static void main(String[] args) {
        
        System.out.println("Start...");
        
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("End...");

    }

}

 

> Object.wait(),等待(条件)

线程转到等待状态释放锁。(既然等待,当然得释放锁了,我们在等待、迎接贵宾时,也是敞开着大门的,哈哈)

持有锁的情况下才能调用此方法,通常搭配外层的循环以判断是否继续等待。

wait方法可以执行时间,也可不,由notify方法唤醒。

 【Java Concurrency】sleep()、wait()、notify()、notifyAll()的用法与区别

 

晚餐、客人、服务员的例子

/**
 * 晚餐
 */
public class Dinner {
    
    private String mainDish; // 主菜

    public String getMainDish() {
        return mainDish;
    }

    public void setMainDish(String mainDish) {
        this.mainDish = mainDish;
    }
    
}
View Code

相关文章: