Java多线程学习笔记(三) wait/notify

1.wait()

  • wait()的作用是使当前执行代码的线程进行等待, 知道接到通知(notify)或者中断为止
  • wait()是Object类的方法
  • 当线程处于wait,调用interrupt()会出现InterruptedException
  • 在调用wait()之前,线程必须获得该对象的对象级别锁
  • 在调用wait()之后,线程释放锁
  • wait(long),等待超过这个时间自动唤醒

2.notify()

  • 在调用notify()之前,线程必须获得该对象的对象级别锁
  • 在调用notify()之后,线程不会立刻释放锁,要退出synchronized代码块后才会释放锁
  • 如果有多个线程等待,则由线程规划器随机选1个线程,对其发出notify
  • 如果要唤醒所有线程,使用notifyAll(),可解决多生产者/消费者假死状态问题

3.实验wait/notify

3.1 调用wait()的线程

public class MyThreadOne extends Thread{
    private Object lock;

    public MyThreadOne(Object lock){
        super();
        this.lock = lock;
    }

    @Override
    public void run(){
        try{
            synchronized (lock){
                System.out.println("wait begin");
                lock.wait();
                System.out.println("wait end");
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

}

3.2 调用notify()的线程

public class MyThreadTwo extends Thread {
    private Object lock;

    public MyThreadTwo(Object lock){
        super();
        this.lock = lock;
    }

    @Override
    public void run(){
        synchronized (lock){
            System.out.println("notify begin");
            lock.notify();
            System.out.println("notify end");
        }
    }
}

3.3 测试类

public class Test {
    public static void main(String[] args) {
        try{
            Object lock = new Object();
            MyThreadOne t1 = new MyThreadOne(lock);
            t1.start();
            Thread.sleep(2000);

            MyThreadTwo t2 = new MyThreadTwo(lock);
            t2.start();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

3.4 结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/winterking3/article/details/83623219
今日推荐