首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...sleep 可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中的一个线程...比如微服务体系中,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...比如一些用户登录场景,当用户登录状态改变时,发送登录事件进行后续处理,比如登录通知等等等待和唤醒等待和唤醒机制一般适用于等待时间较长的场景,因为等待和唤醒是一个性能消耗比较大的操作;在等待时间不是很长的场景可以使用轮询机制...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

1.6K30

017:为什么不建议在循环中使用“+”拼接字符串

如果要使用循环构建一个大的字符串,推荐使用StringBuilder代替String,使用StringBuilder的append()方法进行字符串连接,并在循环结束后将StringBuilder对象转为...:在第9行的时候做条件判断,如果不满足循环条件,则跳转到42行。...编译器做了一定程度的优化,在12行new了一个StringBuilder对象,然后再20行、24行、29进行了三次append方法的调用,不过重点是,每次循环都会new一个StringBuilder对象...,可以看出,在第4行(循环体外)就构建好了StringBuilder对象,然后再循环体内只进行append()方法的调用。...这就从字节码层面解释了为什么不建议在循环体内使用“+”执行字符串的拼接。 参考资料 《Effective Java(第二版)》 《Java编程思想》

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

    PAT 1017 Queueing at Bank (25分) prioriry_queue

    为了提高效率,我们单独创建一个变量index来记录有效的客户数目,什么叫有效的客户,就是能够被服务的客户,在17:01之前来的客户,所以每次读入一个客户的到达时间时,先判断一下是不是>17:00,如果成立...然后就是逐个处理每个客户,就是一个for循环。...对于每个客户,他需要去k个窗口中最早结束当前服务的那个窗口,我们需要记录k个窗口每个窗口当前服务的结束时间,而且还得按结束时间从早到晚排序方便用户去选择,这不很明显了嘛,就是一个最小堆,也就是使用priority_queue...我们在堆里存放每个窗口当前服务的结束时间就可以了。...那我就要等待了,等那个窗口服务完再去排队,这是我们就要统计等待时间,之后的操作类似,还是弹出堆顶元素(相当于这个窗口在我来之前结束当前服务),压入新的元素(我过来后这个窗口当前服务结束时间就改变了);

    41920

    干货收藏!Python完整代码带你一文看懂抽样

    在简单随机抽样中,得到的结果是不重复的样本集,还可以使用有放回的简单随机抽样,这样得到的样本集中会存在重复数据。该方法适用于个体分布均匀的场景。 2....没有考虑业务增长性:在成长型公司中,公司的发展不都是呈现线性趋势的,很多时候会呈现指数趋势。这时需要根据这种趋势来使业务满足不同增长阶段的分析需求,而不只是集中于增长爆发区间。...例如数据集有5个特征,假如每个特征有2个值域,那么数据记录数需要至少在1000(100×5×2)条以上。...由于sample库要求抽取的对象是一个序列或set,因此这里使用了一个列表推导式直接基于data数据集的记录数生成索引列表,然后再返回给sample随机抽样,抽样数量为2000;最后从data中直接基于索引获得随机抽样后的结果...使用Numpy的unique方法获得唯一值。 通过for和while循环,遍历一个可迭代的对象。 if条件语句的使用,尤其是单条件和多条件判断。

    2K20

    MySQL从删库到跑路_高级(九)——存储过程

    游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 尽管游标能遍历结果中的所有行,但一次只指向一行。 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。...2、游标的特性 游标具有三个属性: A、不敏感(Asensitive):数据库可以选择不复制结果集 B、只读(Read only) C、不滚动(Nonscrollable):游标只能向一个方向前进,并且不可以跳过任何一行数据...5、游标的适用场景 MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。...#创建游标 DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30; #指定游标循环结束时的返回值...#创建游标 DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30; #指定游标循环结束时的返回值

    76230

    Power Query中批量处理操作(5)

    3参数计算结果3作为赋值,判断3结果是False,循环结束返回所有赋值过的数据(包含初始赋值,不包含最后一个不符合条件的赋值)组成列表,也就是{1,2},其中1就是初始赋值。...初始赋值公式使用()=>,这里赋值的是1个具有2项的列表,列表中的第1项初始赋值为2,是作为数值计算的初始值,列表中的第2项初始赋值为0,是做循环累计数。...所以我们在循环的时候就已经对展示结果做了指定的输出,也就是第4参数返回的结果是循环次数,最终我们取循环次数累计值的最后一个,也是25。...1.1 = 108.35 解释: 因为我们考虑到循环终止时还是处于100元以下,所以如果要达到100元的目标值,还需要继续加1次涨停,同理在循环的时候我们取列表的金额,在最后一次循环金额的基础上再做一次涨停价格计算...) =25 逻辑都是一样,只不过用记录的话是不是更能让人理解些呢?

    58030

    要面试了,你还没有掌握MySQL join的原理?

    原理 Nested-Loop Join 算法,需要区分驱动表和被驱动表,先访问驱动表,筛选出结果集,然后将这个结果集作为循环的基础,访问被驱动表过滤出需要的数据。...MySQL-SNLJ 这里会扫描 A 表,将记录一行一行地取出来进行匹配。其实就是用 A 的结果集做为外循环,读取每一行都会触发一个内循环(扫描 B 表)。对 B 表的数据进行比较,加入结果集。...不走索引,不存在回表。 3. 小结 以上就是嵌套循环算法的三种实现。 假设有这样的数据: 驱动表为 A,记录数 N;被驱动表为 B,记录数 M。...在执行计划 Explain 中如果发现使用了块嵌套循环的实现,要检查一下 sql,考虑对 join 的字段加入索引。...如果无法使用索引,那么注意调整 join buffer 大小,适当调大些。 小结果集驱动大结果集。用数据量小的表去驱动数据量大的表,这样可以减少内循环个数,也就是被驱动表的扫描次数。

    58210

    数字硬件建模SystemVerilog-循环语句

    如果表达式为false,则循环退出。 在每次循环结束时执行step_assignment。再次计算end_expression。如果为真,则循环重复,否则退出循环。...零延迟和定时循环(Zero-delay and timed loops) 零延迟循环不包含任何形式的时序。零延迟循环代表组合逻辑。在仿真中,零延迟循环会立即执行。...示例6-8使用一个执行固定次数的静态循环,避免不是在循环结束时提前终止循环,而不是根据数据的值(data值)来确定循环的结束。...这个模型的输出q是时序逻辑,因此q要使用非阻塞赋值,循环中的迭代是组合逻辑,其最终结果记录在阻塞赋值的临时变量中,因此,它的新值可用于循环的下一次迭代。...乘法器链的总传播延迟需要小于等于一个时钟周期,以便在输出触发器中记录有效且稳定的结果。一些综合编译器可以进行寄存器重定时,插入或移动寄存器,以在组合逻辑中创建流水。

    2.7K20

    【Java 并发编程】线程池机制 ( 测试线程开销 | 启动线程分析 | 用户态 | 内核态 | 用户线程 | 内核线程 | 轻量级进程 )

    文章目录 一、测试线程开销 1、正常测试 2、不创建线程 3、只创建不启动线程 4、只启动不等待执行完成 二、分析测试结果 1、启动线程分析 2、用户线程与内核线程 3、轻量级进程 4、验证 Java...线程类型 一、测试线程开销 ---- 线程池是线程的缓存 , 在 Java 高并发场景中 , 所有的异步操作 , 都可以使用线程池 ; 使用线程池时 , 不建议用在 " 执行耗时较长的操作 " 的业务场景中...thread.start(); // 等待线程执行完成 thread.join(); } // 记录程序执行结束时间...: 1 ms 执行完毕 ; 说明耗时操作是在 for 循环中 ; 3、只创建不启动线程 注释掉线程启动代码 : public class Main { /** * 线程中对该值进行累加操作...: 耗时 3.866 秒 ; 二、分析测试结果 ---- 1、启动线程分析 在上述测试中 , 如果只是创建 10 万个 Thread 对象 , 这些在 Java 中就是普通的对象 ; 但是如果调用了

    1.3K10

    使用并发 ssh 连接来提升捞日志脚本执行效率

    问题背景 公司有个简单粗暴的日志服务,它部署在多台机器实例上,收集的日志记录在每台机器本地硬盘,写一个小时自动切换日志文件,硬盘空间写满了自动回卷,大约可以保存两三天的历史数据。为什么说它粗暴呢?...这里使用 keyword 的 md5 作为文件名的一部分 (eg: /tmp/work.yyyymmddhh.xxxxxxxxxxxx),避免服务器文件冲突 (同时指定一个 keyword 的场景最好共享结果...其实聪明的读者已经看出来了,上面一顿忙活,也只是解决了 1/4 的耗时问题,还有三大耗时在这儿摆着: 执行过滤脚本 回传过滤结果 删除过滤结果 而且这已经是在远程机异步执行了,如果同步执行那就更慢了。...\ 释义) 按是否有 date 参数做下区分,有的话会将 date 参数给到远程实例的 fetch_log.sh 脚本,没有的话不传递这样就会使用当前日志文件了 从 while 循环结束时,通过 wait...回传过滤结果和删除之间不需要 Sleep,因为前者在跑批中已经 wait 了,子进程结束后对应的任务也结束了,不像执行过滤脚本,子进程结束时,真正的 grep 进程可能还在远程实例上跑着呢!

    1.1K30

    PAT 1014 Waiting in Line (30分) STL queue

    Input Specification: Each input file contains one test case....要求输入q个人,以HH:mm的格式输出他们的服务结束时间。银行在17:00点停止服务,如果一个客户在17:00以及以后还没有开始服务(此处不是结束服务是开始17:00)就输出Sorry。...易错点分析 这个题最易错的地方是如何判断一个客户无法完成服务, 是看他的结束时间是否超过17:00吗??不不不不不,只要他在17:00前开始被服务,银行就必须给他服务完才结束下班。...所以我们要看他的开始服务时间是不是超过17:00,而不是结束时间!!!...解题思路 既然是排队,那么当然要用队列了,每个窗口前都有一个队,假如有n个窗口,那就建n个队列呗,但是因为编号都是从1开始,所以直接建n+1个队列好了 使用结构体来保存顾客的信息,包括==开始服务时间=

    49010

    Python实现微秒级延时

    实现方法 记录初始时间戳,然后进入循环,每次循环记录一次时间戳,循环判断条件是记录的时间戳减去初始时间戳小于设定的时间就继续循环,直到大于等于设定时间。...=time.time() # 记录结束时间 使用方法:将上面的代码复制粘贴到你的程序,然后调用函数 delayMicrosecond(t) 括号内t为延时时间,单位为微秒。...上面的源码中的 t-3 是时间补偿,因为调用函数,执行循环等指令也会消耗时间,可以根据自己测试出来自己修改,我用树莓派4测试出的结果是多消耗了3微秒,所以要减去3。...=time.time() # 记录结束时间 a=time.time() # 记录延时函数开始执行时的时间 delayMicrosecond(35) #延时 35 微秒 b=time.time...() # 记录延时函数结束时的时间 print("https://blog.zeruns.tech/") print((b-a)*1000000) # 将延时函数执行消耗的时间打印出来 效果

    3.3K10

    Python实现微秒级延时

    实现方法 记录初始时间戳,然后进入循环,每次循环记录一次时间戳,循环判断条件是记录的时间戳减去初始时间戳小于设定的时间就继续循环,直到大于等于设定时间。...=time.time() # 记录结束时间 使用方法:将上面的代码复制粘贴到你的程序,然后调用函数 delayMicrosecond(t) 括号内t为延时时间,单位为微秒。...上面的源码中的 t-3 是时间补偿,因为调用函数,执行循环等指令也会消耗时间,可以根据自己测试出来自己修改,我用树莓派4测试出的结果是多消耗了3微秒,所以要减去3。...=time.time() # 记录结束时间 a=time.time() # 记录延时函数开始执行时的时间 delayMicrosecond(35) #延时 35 微秒 b=time.time...() # 记录延时函数结束时的时间 print("https://blog.zeruns.tech/") print((b-a)*1000000) # 将延时函数执行消耗的时间打印出来 效果

    2K40

    订单推送设计思路-基于支付ID而不是订单号来推送

    develop/server/ecpay/order/order-sync 1.发送订单支付成功事件,根据MQ消息中定义的type来区分不同的支付项目 2.定时任务的关键参数,商家订单号,支付金额,支付时间,在使用公用模块...,公用方法中,需要替换成当前定时任务JOB的当前对象的关键参数:商家订单号,支付金额,支付时间 定时任务的outOrderNo payTime payAmt 不取公共方法中,而是取的定时任务的当前记录的...无需重复推送 5.加上日志 “抖音推送” 等关键字,便于日志检索,类似RequestId功能,同时在try-catch 异常捕获中也需要加上该关键字。...6.循环思路 * 构建终止退出机制 * 构建新的记录循环机制 * 构建记录之间不相互,循环中某一条异常了,对其他的循环对象不影响中断。...初始化下一次的记录,及备份当前成功的记录(逻辑删除,转移到备份表,新增下一次定时任务分账的记录) 7.兜底,闭环思路 订单开始时间,到订单结束时间,考虑将订单结束时间收尾。

    10010

    Jmeter系列二:CSV参数化、BeanShell、服务器监控等进阶使用

    那么对于使用工具来说也不例外,先从一个最简单的Hello world来熟悉一下Jmeter吧。...线程组配置说明 配置项 描述 线程数 如中文所示 Ramp-Up Period(in seconds) 所有线程启动所需时间 循环次数 每个线程的循环次数 Delay Thread creation until...needed 线程在需要的时候才创建 调度器 勾选与否决定是否启动调度器 持续时间 测试持续时间 启动延迟 多久的延迟后启动测试 启动时间 测试启动时间,会被“启动延迟”覆盖 结束时间 测试结束时间,...1、右键 → 添加 → 配置元件 → Http请求默认值 2、填写协议和响应的服务器地址、端口 3、http请求中,可以不填步骤2的信息 4、执行测试,查看结果 ? 公用原件 - http默认值 ?...使用说明(推荐有Java开发基础的人使用) 1、打开你的IDE,编写Java代码,打包成Java 2、在Jmeter引用你的Java包 3、在Http请求右键 → 添加 → 前置处理器 → Beanshell

    81530
    领券