天天看点

java多线程(七)对象的wait/notify方法1 Monitor主要结构2 各自转化规则3 API介绍(注意是对象的方法,不是线程)4 wait(long t)和sleep(long t)的区别5 wait/notify正确使用逻辑

基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程

目录

  • 1 Monitor主要结构
  • 2 各自转化规则
  • 3 API介绍(注意是对象的方法,不是线程)
  • 4 wait(long t)和sleep(long t)的区别
  • 5 wait/notify正确使用逻辑

1 Monitor主要结构

java多线程(七)对象的wait/notify方法1 Monitor主要结构2 各自转化规则3 API介绍(注意是对象的方法,不是线程)4 wait(long t)和sleep(long t)的区别5 wait/notify正确使用逻辑
  • Owner:正拥有对象的线程(RUNNABLE);
  • EntryList:处于阻塞状态(BLOCKED)的等待Owner使用完对象的其他线程;
  • WaitSet:当前线程发现自己条件不具备,调用wait方法,进入阻塞(WAITING)状态;

2 各自转化规则

  • BLOCKED线程会在Owner线程释放锁时被唤醒;
  • WATING线程会在Owner线程调用notify或者notifyAll时候被唤醒进入EntryList,BLOCKED状态,如果获得锁成功进入RUNNABLE状态;

3 API介绍(注意是对象的方法,不是线程)

  • obj.wait:obj让线程进入Monitor的waitSet进行等待,线程进入WAITING状态;
  • obj.notify:obj上正在做waitset中的线程,随机挑一个唤醒;
  • obj.notifyAll:让所有在obj上正在waitSet的线程唤醒;

    前提:都必须获得了锁,才能调用这些方法。

4 wait(long t)和sleep(long t)的区别

  • sleep是Thread的方法,wait是Object的方法;
  • sleep不需要获得锁才能使用,但是wait必须要的synchronized一起使用;
  • sleep在睡眠时不会释放锁,但是wait在等待时会释放锁;
  • 都会使得线程进入TIMED_WAITING状态;

5 wait/notify正确使用逻辑

对于需要满足条件才继续执行的线程:

synchronized (lock){
    while (!canDo){
        try {
            lock.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //条件成立,可以工作
    System.out.println("工作--");
}
           

对于改变条件的线程,即通知别人的线程:

synchronized (lock){
    canDo=true;
    lock.notifyAll();
}
           

建议使用notifyAll()来实现。