面试官:请你说一下sleep()、wait()、join()和yield()的区别

面试官:请你说一下sleep()、wait()、join()和yield()的区别

我们先来介绍下锁池与等待池的概念。

首先来看下锁池的概念

所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其它线程需要在这个锁池进行等待,当前面的线程释放同步锁侯锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。

接着来看看等待池的概念

当我们调用wait() 方法后,线程会放到等待池中,等待池的线程是不会去竞争同步锁。只有调用了notify() 或notifyAll() 后等待池的线程才会开始去竞争锁,notify() 是随机从等待池选出一个线程放到锁池,而notifyAll() 是将等待池的所有线程放到锁池当中。

sleep 是 Thread 类的静态本地方法,wait 则是Object的本地方法。

sleep 方法不会释放lock,但是wait 会释放,而且会加入到等待队列中。

sleep就是把cpu的执行资格和执行权释放出去,不再运行此线程,当定时事件结束再取回cpu资源,参与cpu的调度,获取到cpu资源后就可以继续运行了,而如果sleep时该线程有锁,那么sleep不会释放这个锁,而是把锁带着进入了冻结状态,也就是说其它需要这个锁的线程根本不可能获取到这个锁。也就是说无法执行程序,如果在睡眠期间其它线程调用了这个线程的interrupt方法,那么这个线程也会抛出interruptexception异常返回,这点和wait是一样的。

sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。

sleep不需要被唤醒(休眠之后退出阻塞),但是wait需要(不指定时间需要被别人中断)。

TextCortex TextCortex

AI写作能手,在几秒钟内创建内容。

TextCortex 62 查看详情 TextCortex

sleep一般用于当前线程休眠,或者轮询暂停操作,wait则多用于多线程之间的通信。

sleep会让出CPU执行时间且强制上下文切换,而wait则不一定,wait后可能还是有机会重新竞争到锁继续执行的。

yield() 执行后线程直接进入就绪状态,马上释放了cpu的执行权,但是依然保留了cpu的执行资格,所以由可能cpu下次进行线程调度还会让这个线程获取到执行权继续执行。

(学习视频分享:java视频教程)

join() 执行后线程进入阻塞状态,例如在线程B中调用线程A的join() ,那线程B会进入到阻塞队列,指导线程A结束或中断线程。

public static void main(String[] args) throws InterruptedException {        Thread t1=new Thread(()->{            try {                Thread.sleep(4000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("休眠sleep线程");        });        t1.start();        t1.join();        System.out.println("线程执行完成");    }

原文链接:https://blog.csdn.net/lxn1023143182/article/details/114134498

相关推荐:java面试题及答案

以上就是面试官:请你说一下sleep()、wait()、join()和yield()的区别的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1020753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 01:18:50
下一篇 2025年12月2日 01:19:11

相关推荐

  • W3C面试指南:评估候选人的Web无障碍能力

    W3C面试标准:考察候选人在Web可访问性方面的能力 简介:随着互联网的普及和发展,Web可访问性越发引起人们的关注。在用户多样化的今天,一个良好的网站或应用程序应该能够提供无障碍的访问,让所有用户都能够获得相同的信息和使用体验。为了保证招聘到具备相关技能的候选人,W3C制定了一套面试标准,用来考察…

    2025年12月21日
    000
  • 一次前端面试的经历

    今天给大家分享我之前找工作的面试经历,我辞去了杭州的工作之后去往了深证,给大家分享一下我面试的4次经历 写在最前面: 上个月底辞掉了在杭州的工作,来到了广州开始找工作,讲道理广州的这座城市的经济中心真的不在互联网,个人感觉还不如互联网发展的杭州,找了一个礼拜的工作之后,少许感悟 第一家面试公司: 第…

    好文分享 2025年12月21日
    000
  • 关于前端面试(二)

    今天给大家分享我之前找工作的面试经历,我辞去了杭州的工作之后去往了深证,给大家分享一下我第二波面试的经历。 面试了两了礼拜,首先第二个礼拜的质量表示没有第一个礼拜的质量好,几乎没有面试到什么质量高的公司,下面总结 不知道是第几家家公司: 这家公司是做金融的,需要在线上推广之类的,需求很简单,写写静态…

    好文分享 2025年12月21日
    000
  • JavaScript中什么是生成器_yield关键字作用

    生成器是用function*声明的可暂停恢复执行的特殊函数,通过yield实现惰性求值与双向通信,返回可迭代对象,常用于异步流程控制、按需数据生成及状态机实现。 生成器(Generator)是 JavaScript 中一种特殊的函数,它能**暂停和恢复执行**,配合 yield 关键字使用,让函数变…

    2025年12月21日
    000
  • js中join()方法的使用

    join() 方法用于将数组元素连接成字符串,不修改原数组。默认以逗号分隔,可自定义分隔符,空数组返回空字符串,null 或 undefined 转为空字符串。 在 JavaScript 中,join() 是数组的一个内置方法,用于将数组中的所有元素连接成一个字符串。这个方法不会修改原数组,而是返回…

    2025年12月21日
    000
  • C++ 面试解析器:轻松搞定编程面试难题

    有了c++++面试解析器,您无需再手动分析面试问题。解析器自动化流程,使用自然语言处理分解问题,然后从其知识库中生成合适的c++代码模板。这款工具节省了时间和精力,并确保了高效、准确和交互式的面试体验,让您自信地展示您的c++技能。 C++ 面试解析器:轻松解决编程面试难题 简介 C++ 是一种强大…

    2025年12月18日
    000
  • C#基础之yield与Singleton

    1.实例解析yiled的作用 最近参加java笔试题第一次见到yield这个关键字,既然遇见了那肯定要掌握,下面是c#中关于yield关键字的总结。yield这个关键字作用于迭代器块中,其最本质的功能有2个:一是“依次”向枚举对象提供值,二是发出迭代结束信号。这两个功能对应的语句分别是yield r…

    2025年12月17日
    000
  • python中yield关键字是做什么的_Python生成器yield关键字详解

    yield关键字使函数成为生成器,可暂停执行并按需返回值。生成器是特殊的迭代器,无需手动实现__iter__和__next__,通过yield自动保存状态,相比传统迭代器更简洁、内存友好。调用next()时,生成器从上次yield处继续执行,适用于大文件读取、斐波那契数列、数据流处理等场景,提升效率…

    2025年12月14日
    000
  • Python中yield关键字解析 生成器函数yield在Python中的使用场景

    生成器函数是使用yield关键字的函数,能暂停执行并逐步产出值。它与普通函数不同,调用时返回生成器对象而非立即执行,适合处理大数据、惰性求值等场景。1. yield产出值并保留状态,等待下次调用继续执行;2. 生成器节省内存,适合处理大文件或无限序列;3. yield可用于简化流程控制;4. yie…

    好文分享 2025年12月14日
    000
  • php中的yield关键字有什么用?php生成器yield关键字用法解析

    yield关键字用于创建生成器,实现内存高效的迭代操作。它通过暂停函数执行并逐个返回值,避免一次性加载大量数据,适用于处理大文件、数据库结果集等场景。相比传统数组,生成器节省内存、支持延迟计算,并可处理无限序列。使用yield from可委托其他生成器,提升代码模块化。yield还能与send()方…

    2025年12月10日
    000
  • PHP中如何定义生成器变量?

    在php中,生成器变量通过yield关键字定义,用于高效处理大数据集。1)定义生成器函数,如xrange,使用yield产生值。2)使用foreach遍历生成器,逐步处理数据,节省内存。生成器在处理大数据时非常有用,但需注意其执行和外部变量状态管理。 在PHP中定义生成器变量是一种非常酷的方式,可以…

    2025年12月10日
    000
  • PHP 函数面试攻略:如何准备才能脱颖而出

    PHP 函数面试攻略:备战高光的秘诀 简介 PHP 函数是开发者必备技能,在面试中常常被问及。为了脱颖而出,充分准备是关键。本文将提供备战 PHP 函数面试的实用策略和实战案例。 基本概念 立即学习“PHP免费学习笔记(深入)”; 函数定义:使用 function 关键字定义函数,指定函数名、参数列…

    2025年12月9日
    000
  • 社交,产量和经济范式转变:Pop Max是否领导了指控?

    探索pop max等社交平台如何融合分散金融与社区,将用户行为转化为有形资产,并重塑经济范式。 社交、产量与经济范式的变革:Pop Max是否引领潮流? 在不断演进的Web3领域中,社交互动与去中心化金融的结合正在开辟令人振奋的新可能。诸如Pop Max之类的平台正站在这一浪潮的最前沿,致力于重新定…

    2025年12月8日
    000
  • 如何在mysql中使用JOIN关联多表

    答案是使用JOIN可关联多表查询数据,需明确连接条件并选择合适类型。通过INNER JOIN获取匹配记录,LEFT/RIGHT JOIN保留主表全部数据,结合ON指定关联字段,如用户、订单、商品三表通过外键关联查询信息,并建议添加索引、避免冗余JOIN以优化性能。 在 MySQL 中使用 JOIN …

    2025年12月6日 数据库
    000
  • SQL中JOIN操作中的NULL匹配 JOIN连接时NULL值的匹配问题解决方案

    避免sql join中null匹配问题的方法包括:1.使用coalesce函数替换null值;2.通过is null条件显式匹配null;3.采用外连接保留所有行;4.创建自定义函数处理复杂逻辑。关键在于理解null不等于null的特性,利用sql函数和语法处理,同时在数据库设计阶段减少null值存…

    2025年12月3日 数据库
    000
  • Mysql中的join操作详解

    这篇文章主要介绍了mysql join操作的相关资料,需要的朋友可以参考下  join的类型 1.  内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。 2.  外联结:分为外左联结和外右联结。 案例背景 create table java (name varchar(25…

    2025年12月2日
    000
  • 详解MySQL JOIN原理介绍

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: … FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表;table2:右表。 JOIN 按照功能大致分为如下三类: INNER JOIN(内…

    2025年12月2日 数据库
    000
  • mysql中JOIN连接查询如何使用_mysql JOIN语法教程

    答案:JOIN用于关联多表数据,INNER JOIN返回匹配的记录,LEFT JOIN保留左表全部记录,RIGHT JOIN保留右表全部记录,FULL JOIN可通过UNION实现,多表连接可使用别名提升可读性,且需注意连接顺序对性能的影响。 在MySQL中,JOIN用于将两个或多个表根据相关列进行…

    2025年12月2日 数据库
    100
  • 面试官:请详细说明final关键字的作用,以及它与static的区别

    前言: 果不其然,在上次的面试中面试官又问了这样的问题:请你说下final关键字的具体含义,并详细讲解它的作用以及它与static的区别。为了让正在面试中的各位重视这个问题,特意将答案整理出来以供大家参考。 1、final关键字的含义 final表面意思就是不可更改的,恒量的意思;类似于C语言中的c…

    2025年12月2日 java
    000
  • sql中left join和right join的区别 一文搞懂左右连接的不同使用场景

    left join 和 right join 的区别在于以哪张表为基准保留所有行。left join 保留左表所有行,即使右表无匹配,此时右表列值为 null;right join 保留右表所有行,即使左表无匹配,此时左表列值为 null。例如,在 customers 表与 orders 表的连接中…

    2025年12月1日 数据库
    000

发表回复

登录后才能评论
关注微信