当前位置: 首页 > article >正文

线程控制方法之wait和sleep的区别

线程控制方法之wait和sleep的区别

wait()和sleep()都是Java线程控制方法,但存在明显区别:

  1. 所属与调用:wait()属Object类,需synchronized调用;sleep()属Thread类,可随意调用。
  2. 锁处理:wait()释放锁,进入等待状态;sleep()不释放锁,仅暂停执行。
  3. 唤醒机制:wait()需notify()或notifyAll()唤醒;sleep()自动苏醒。
  4. 用途:wait()多用于线程间通信;sleep()用于暂停执行。
  5. 异常:两者都可能抛出InterruptedException。

总结:wait()释放锁并等待唤醒,用于线程通信;sleep()不释放锁且自动苏醒,用于暂停执行。

public class ThreadDemo25 {
    public static void main(String[] args) {
        Object locker=new Object();
        Thread t1=new Thread(()->{
           synchronized (locker){
               System.out.println("wait之前");
               try {
                   locker.wait();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("wait之后");
           }
        });
        Thread t2=new Thread(()->{
            try {
                Thread.sleep(5000);
                synchronized (locker){
                    System.out.println("notify之前");
                    locker.notify();
                    System.out.println("notify之后");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        });
        t1.start();
        t2.start();
    }
}

在这里插入图片描述

t2的notify()唤醒t1之后,只有等t2执行完自己的,释放锁之后,t1才能继续。所以先打印notify之后,再打印wait之后

t2 sleep结束之后,由于t1是wait状态,锁是释放的,t2就能拿到锁。

接下来打印t2 notify之前,执行notify操作,这个操作就能唤醒t1(此时t1就从WAITING状态恢复回来了)

但是由于t2此时还没有释放锁呢,t1 WAITING恢复之后,尝试获取锁,就可能会出现一个小小的阻塞,这个阻塞是由于锁竞争引起的。(肉眼很难看到BLOCKED状态,这个状态的变换是非常快的)

t2执行完t2 notify之后,释放锁,t2执行完毕,t1的wait就可以获取到锁了,继续执行打印t1 wait之后。


http://www.kler.cn/a/408089.html

相关文章:

  • 《操作系统 - 清华大学》4 -5:非连续内存分配:页表一反向页表
  • 003 STM32基础、架构以及资料介绍——常识
  • 【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
  • 无插件直播流媒体音视频播放器EasyPlayer.js播放器的g711系列的音频,听起来为什么都是杂音
  • MySQL 中的锁
  • 【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏
  • 深入理解索引(二)
  • ubuntu搭建k8s环境详细教程
  • 「Mac玩转仓颉内测版28」基础篇8 - 元组类型详解
  • linux ollama安装没有sudo权限
  • Android 不同情况下使用 runOnUiThread
  • H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来
  • IIFE - 立即执行函数
  • Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画
  • C# 委托与事件
  • Linux——进程间通信之管道
  • docker 容器运行Ruoyi-cloud
  • 二.LoadBalancer负载均衡服务调用(1)
  • python代码制作数据集的测试和数据质量检测思路
  • SQL注入--DNSlog外带注入--理论
  • Android开发实战班 - 应用架构 - 单向数据流(Unidirectional Data Flow, UDF)
  • Java 8 Stream API 在数据转换中的应用 —— 将列表转换为映射
  • 怎么只提取视频中的声音?从视频中提取纯音频技巧
  • 【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署
  • 【AI系统】GPU 架构与 CUDA 关系
  • 简单版面试