您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 3浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 wait 的作用和用法

java持续实践 发布时间:2020-08-29 15:40:27 ,浏览量:3

文章目录
      • wait notify notifyAll 作用 用法
      • wait的基本用法demo

wait notify notifyAll 作用 用法

wait notify notifyAll 作用 在不同的阶段

  • 阻塞阶段 阻塞状态的线程 ,直到遇到下列四种情况之一的时候, 才会被唤醒
  1. 另一个线程调用这个对象的notify()方法, 刚好唤醒的是本线程 . (notify只会选取一个线程去唤醒. )
  2. 另一个线程调用这个对象的notifyAll()方法
  3. 过了wait(long timeout)规定的超时时间, 如果传入的是0 , 那么就进入了永久的等待.
  4. 在等待的过程中, 调用了interrupt, 被中断了
  • 唤醒状态 wait notify 都必须在synchronized 保护的代码块中去执行. 否则会抛出异常.
  • 遇到中断
wait的基本用法demo

如下的代码展示了wait的基本用法

  1. 研究代码的执行顺序. 执行顺序为 , 主线程中, 首先启动了线程1 ,并且调用了sleep , 保证线程1的优先执行, 线程1 进入了同步代码块中之后, 调用了object.wait(); 方法, 进入了阻塞的状态. 由于调用了object.wait(); , 那么也释放了synchronized (object)锁, 因此线程2 获得锁, 线程2 执行后, 调用了object.notify(); , 唤醒了线程1, 线程1 重新的获得了锁, 打印了获得锁的语句.
  2. 证明wait释放了锁 在上面的分析执行步骤中, 也可以看到由于线程1 调用了object.wait(); 方法, 释放了锁, 因此证明了wait方法释放了锁.
package com.thread.threadobjectclasscommonmethods;

/**
 * 类名称:Wait
 * 类描述: 展示wait的基本用法
 * 1. 研究代码的执行顺序
 * 2. 证明wait释放了锁
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/29 15:06
 * Version 1.0
 */
public class Wait {

    // 锁对象
    public static final Object object = new Object();

    static class Thread1 extends Thread{
        @Override
        public void run() {
            synchronized (object) {
                System.out.println("线程 "+ Thread.currentThread().getName() + "syn代码块中,  开始执行 ");
                try {
                    //调用wait , 释放锁.
                    object.wait();
                } catch (InterruptedException e) {
                    //在执行等待期间, 如果遇到中断了, 就会抛出 InterruptedException
                    e.printStackTrace();
                }
                //重新获取锁
                System.out.println("线程 "+ Thread.currentThread().getName() + " 获取到了锁 ");

            }

        }

    }

    static class Thread2 extends Thread {
        @Override
        public void run() {
            synchronized (object) {
                //线程1 释放了锁, 线程 2 因此能进入此同步代码块. 
                //调用notify的前提是要有线程处于wait状态. 因此要保证线程1 先执行 .
                object.notify();
                System.out.println("线程 "+ Thread.currentThread().getName() + " 调用了notify ");
            }
        }
    }

    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();

        thread1.start();

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();
    }
}

控制台打印如下 . 打印的内容与分析的执行顺序相同 .

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0715s