>关于本文
本文介绍sleep()、wait()、notify()、notifyAll()方法,主要要理解:
- sleep()和wait()的区别。
- wait()与notify()、notifyAll()之前互相协调的关系。
- 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方法唤醒。
晚餐、客人、服务员的例子
/** * 晚餐 */ public class Dinner { private String mainDish; // 主菜 public String getMainDish() { return mainDish; } public void setMainDish(String mainDish) { this.mainDish = mainDish; } }