• Java | sleep、wait、yield、join、notify、notifyAll


    sleep、wait、yield、join、notify、notifyAll

    1. sleep

    sleep(): 是Thread的静态方法 让调用线程进入睡眠状态,虽然线程睡眠了, 但是对象的锁没有释放,到时间会自动苏醒 , 线程变为阻塞状态;

        public static void main(String[] args) throws Exception{
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("线程 run运行 睡眠前 状态:"+Thread.currentThread().getState());
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println("线程 run运行 苏醒后  状态:"+Thread.currentThread().getState());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            System.out.println("线程 start运行     状态:"+thread.getState());
            TimeUnit.SECONDS.sleep(1);
            System.out.println("线程 等待一秒后     状态:"+thread.getState());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    2. wait

    wait(): 是Object 的方法, wait()方法在线程休眠的同时会释放掉锁,其他线程可以访问.需要其他线程调用notify 唤醒,wait 使用时必须先获取对象锁,必须在synchronized 修饰的代码块中使用.依赖锁,线程变为阻塞状态

    public static void main(String[] args) throws Exception {
            Object o = new Object();
    
            //wait 线程
            Thread threadA = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        synchronized (o) {
                            System.out.println(Thread.currentThread().getName() + "线程 获取到锁  wait前   状态:" + Thread.currentThread().getState());
                            o.wait();
                            System.out.println(Thread.currentThread().getName() + "线程 run运行 notify后  状态:" + Thread.currentThread().getState());
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            threadA.start();
            System.out.println(threadA.getName() + "线程 start运行         状态:" + threadA.getState());
            TimeUnit.SECONDS.sleep(1);
            System.out.println(threadA.getName() + "线程 等待一秒后         状态:" + threadA.getState());
    
            //唤醒线程
            Thread threadB = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        synchronized (o) {
                            System.out.println(Thread.currentThread().getName() + "线程 获取到锁 notify前  状态:" + Thread.currentThread().getState());
                            o.notify();
                            System.out.println(Thread.currentThread().getName() + "线程 run运行 notify后  状态:" + Thread.currentThread().getState());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            threadB.start();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    3. yield

    yield(): 停止当前线程,线程重回就绪状态,不会让线程进入阻塞状态 让同等或者高于当前线程优先级的线程运行,低于当前线程优先级的线程 yield() 将不会起作用 也是Thread 的静态方法. 线程变为就绪状态;

    4. join

    join(): 使当前线程停下来等待 一直到另一个调用join方法的线程终止 阻塞状态

    5. notify /notifyAll

    notify():唤醒一个线程(唤醒那个线程取决于线程调度器) ,依赖锁

    notifyAll(): 唤醒等待该锁的所有线程. ,依赖锁

  • 相关阅读:
    Win10如何找回图片查看器
    《C++ Primer》第3章 字符串、向量和数组(二)
    HTML期末学生大作业-节日网页作业html+css+javascript
    QT(35)-操作EXCEL-QXlsx-QAxObject
    Spring AOP 使用详解及源码分析
    Hadoop版本演变、分布式集群搭建
    【genius_platform软件平台开发】第七十六讲:vs预处理器定义的牛逼写法!!!!(其他组牛逼conding人员告知这么配置来取消宏定义)
    这些 channel 用法你都用起来了吗?
    生产线平衡分析常用工具大盘点!
    山东大学项目实训(二十七)—— 微信小程序开发总结,一年时间真的可以改变一个人很多
  • 原文地址:https://blog.csdn.net/qq825478739/article/details/126389727