首页
学习
活动
专区
圈层
工具
发布

Java 中为什么不推荐在 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...Demo { private static final boolean FLAG = true; public static void main(String[] args) { while...// do something }}上面的代码你可能会得到下面的警告:Call to ‘Thread.sleep()’ in a loop, probably busy-waiting// 循环中调用...sleep 可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中的一个线程...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

4.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    多线程:为什么在while循环中加入System.out.println,线程可以停止

    ,而线程栈中的值不是最新的,所以会一直循环,线程并不能停止。...而不加这个关键字,JVM 也会尽力去保证可见性,但是如果 CPU 一直有其他的事情在处理,它也没办法。...最开始的代码,一直处于试了循环中,CPU 处于一直被饱受占用的时候,这个时候 CPU 没有时间,JVM 也不能强制要求 CPU 分点时间去取最新的变量值。...这个时候CPU就有可能有时间去保证内存的可见性,于是while循环可以被终止。...其实,也可以在 while 循环里面加上 sleep ,让 run 方法放弃 cpu ,但是不放弃锁,这个时候由于 CPU 有空闲的时候就去按照 JVM 的要求去保证内存的可见性。如下所示。

    2.3K50

    C语言中循环语句总结

    while循坏:  for循环:  while和for循环的对比: 区别:for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护...如果你希望 n 的初始值为 0 时不进行计算,可以改用 while 循环并将判断条件放在循环之前。  break和continue在循环语句中的作用 break:永久的终⽌循环....环中 continue 后的代码,直接去到循环的调整部分。...while循环中continue对代码的运行影响: 分析代码可以知道它们修改条件的位置不同 对于while循环的修改条件在continue后面所以当i=5时,他没法继续修改,而是陷入i=5的死循环  对于...for循环的修改条件在continue上面,所以当i=5时,它会跳出printf函数来到上面进行条件修改,在i=5这个基础上进行i++ do while语句中break和continue的作用跟while

    5.2K10

    【Java】循环语句for、while、do-while

    ,从而结束循 环,否则循环将一直执行下去,形成死循环。...while循环输出10次HelloWorld while循环计算1-100之间的和 1.4 循环语句3--do...while do...while 循环格式 执行流程 执行顺序...③具体执行的语句 ④循环后,循环变量的变化情况 输出10次HelloWorld do...while 循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成 false ,也依然会循...1.5 循环语句的区别 for 和 while 的小区别: 控制条件语句所控制的那个变量,在 for 循环结束后,就不能再被访问到了,而 while 循环结束还可 以继续使用,如果你想继续使用...扩展知识点 2.1 死循环 死循环: 也就是循环中的条件永远为 true ,死循环的是永不结束的循环。例如: while(true){} 。

    10.9K10

    C语言中的分支循环语句(for,while,do...while篇)

    上篇和大家分享了C语言中的分支循环语句(if、switch),这篇和大家分享C语言分支循环语句中的for循环、while循环、do...while循环 1、while循环 1.1. if与while的对比...这就是if和while的区别,while语句可以实现循环效果。...整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循 环。...3.2. do...while循环的执行流程  在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的 结果是!...=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。 所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。

    44710

    Python数据容器:集合

    前言在 Python 中,数据容器是组织和管理数据的重要工具,集合作为其中一种基本的数据结构,具有独特的特性和广泛的应用。本章详细介绍了集合的定义、常用操作以及遍历方法。...2,在集合1内删除和集合2相同的元素,集合1被修改,集合2不变。...for循坏遍历:# 集合的遍历# 集合不支持下标索引,所以不能用while循坏,可用for循坏set1={1,2,3}for element in set1: print(f"集合的元素有{element...3.在for循环中将列表的元素添加至集合4.最终得到元素去重后的集合对象,并打印输出my_list = ['新闻', '传播', '新闻', '传播', 'Hi', 'Python', 'Hi', 'Python...', 'best']# 定义一个空集合my_set=set()# 通过for循坏遍历列表for element in my_list: # 在for循坏中将列表元素添加至集合 my_set.add

    11.2K31

    分支和循环

    我们可以使⽤ if switch 实现分⽀结构,使⽤ for while do while 实现循环结构 分支结构 1.if 当表达式为真时,语句执行;为假是语句不执行.在c语言中,0为假,非0为真....do while循环是先执行语句,在进行表达式是否为0. 在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的 结果是!...=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。 在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。...整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循 环。...continue和break 1.break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以使⽤ break 来完成。

    29110

    PHP 应用PDO技术操作数据库

    条 "; echo "新插入的ID值: {$mysqli->insert_id} 条 "; } $mysqli->close(); ?...> 逐条读取数据: 通过循环的方式逐条读取数据,并将数据根据HTML格式输出到屏幕,注意用完后释放,否则会非常占用内存. 参数绑定执行: 参数绑定执行其实使用的就是预处理技术,即预先定义SQL语句模板,然后后期使用变量对模板进行填充,然后在带入数据库执行,这里其实可以在带入模板时对数据进行合法验证,保证不会出现SQL注入的现象...echo "插入的行数: {$stmt->affected_rows} "; echo "自动增长ID: {$mysqli->insert_id} "; // 继续填充插入新的变量...> 如果在SELECT查询语句上也使用占位符去查询,并需要多次执行这一条语句时,也可以将mysqli_stmt对象中的bind_param()和bind_result()方法结合起来. <?

    4.5K20

    利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解

    php //造连接对象 $db = new MySQLi("localhost"/【本文中一些PHP版本可能是以前的,如果不是一定要,建议PHP尽量使用7.2以上的版本】/,"root","","0710..._test"); //写SQL语句 $sql = "select * from student"; //检测连接数据库是否成功,失败返回“连接失败”,并退出程序 if(mysqli_connect_error...);//获取所有数据中的关联数组 //$arr = $result->fetch_array(); //while循环遍历数组所有数据 while($arr = $result->fetch_array...php $db = new MySQLi("localhost","root","","0710_info"); if(mysqli_connect_error()){ die("连接失败"); } $...work values(0,'P005','2005-01-01','2010-10-1','山师大','教育部',2)"; if($db->query($sql)){ echo "添加成功"; //插入这条数据的

    1.3K30

    【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

    下面以打印1-10的数字为例,分别展示break在三种循环中的使用和效果 1. break在 while 循环中 #include int main() { int i = 1;...,在while循环、for循环和do...while循环中的使用方法和效果相同。...语句后边的部分不再执行,直接进入下一次循 下面依然以打印1-10的数字为例,分别展示continue在三种循环中的使用和效果 1. continue在 while 循环中 #include while循环中使用continue一样进入死循环) 打印结果为1 2 3 4 6 7 8 9 10 3. continue在 do...while 循环中 #include<stdio.h...: 在while循环和do...while循环中,如果continue刚好跳过了循环变量调整部分,将会导致死循环 而在for循环中,由于循环变量调整部分是单独拿出来的,所以使用continue不会导致死循环

    3.5K10

    C语言基础——循环详解!

    (2)根据条件判断是否执行b和c,如果条件判断a为真(true),继续执行循环主 体;若条件判断值a为假(false),则跳出循环不再执行b 代码。...继续执行循 环后面的代码 (3)执行完b 后,继续判断a是否满足条件。...由于while循环不会自行更改循环控 制变量的内容,所以while循环中为循环控制变量赋值的工作要由设计者自己来 做,完成后再回到步骤(2)重新判断是否继续执行循环。...语句先执行一次,在进行判断,while先判断后执行。...=tarNumber); //注意:循环的条件表达式 printf("恭喜你猜对了,这个数字是:%d",inNumber ); 执行步骤: (1)执行语句a和跳出循环条件b,转(2) (2)计算while

    6.1K00

    python算法与数据结构-循环链表(39)

    一、循环链表的介绍   上一篇我们已经讲过单链表,本篇给大家讲解循单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点,其基本操作和单链表思路一样。 ?...常用的操作有 创建节点 创建循环链表 判断是否为空 头部插入 循环链表的遍历 尾部插入 获取链表长度 根据下标插入一个节点 根据下标删除一个节点 查找是否包含一个节点,并返回其在链表中的位置 根据下标找节点...current = self.head # 循坏找到最后一个节点 while current.next !...= node # 将插入的节点设置为头结点,完成循坏闭合 self.head = node # 每次添加完成一次,长度加1...====== ======2、验证是否为空 ====== 你查询的链表为空 ======3、验证头插和遍历 ====== 你要遍历的循环链表元素有: 1 ======4、继续验证头插和遍历 =

    91230

    异步,同步,阻塞,非阻塞程序的实现

    如果是同步,线程会等待接受函数的返回值(或者轮循函数结果,直到查出它的返回状态和返回值)。如果是异步,线程不需要做任何处理,在函数执行完毕后会推送通知或者调用回调函数。...他们没有关系 异步同步和阻塞非阻塞没有什么本质关联。一个讲的是消息方式,一个讲的是线程状态。...线程在同步调用下,也能非阻塞(同步轮循非阻塞函数的状态),在异步下,也能阻塞(调用一个阻塞函数,然后在函数中调用回调,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞的sleep。...""" while time.time() < now + 2: yield def wait(name): print(name, " start") now...上面的代码中,在一个while循环中轮循timer的状态。由于timer存在于wait中。所以需要把timer“提取”出来。

    11.7K10
    领券