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

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

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...= true; public static void main(String[] args) { while (FLAG) { try {...比如微服务体系中,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...比如一些用户登录场景,当用户登录状态改变时,发送登录事件进行后续处理,比如登录通知等等等待和唤醒等待和唤醒机制一般适用于等待时间较长的场景,因为等待和唤醒是一个性能消耗比较大的操作;在等待时间不是很长的场景可以使用轮询机制...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

1.6K30

详解 JS 中的事件循环、宏微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项

什么是宏任务(MacroTasks)和 微任务(MicroTasks) 宏任务 宏任务是 JavaScript 事件循环中的一个较大的任务单元,每个宏任务在执行时会开启一个新的事件循环 一个宏任务的完成通常会涉及到一个较为完整的工作流程...当 事件循环执行时,它会首先检查宏任务队列,执行完当前宏任务后,再执行所有的微任务。 在微任务执行完毕后,浏览器可能会进行渲染操作(如果需要),然后事件循环会继续到下一个宏任务。...它不会阻止后续代码的执行,而是在背后计时,一旦时间到达,就将回调函数加入到事件队列中,等待执行。...setImmediate 是一个在 Node.js 环境中使用的函数,用于安排一个回调函数在当前事件循环结束后、下一次事件循环开始前被立即执行。...process.nextTick 会在当前事件循环的任何阶段结束后立即执行,甚至在进入下一个事件循环阶段之前。

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

    【linux学习指南】SIGCHLD信号

    其实,⼦进程在终⽌时会给⽗进程发SIGCHLD信号,该信号的默认处理动作是忽略,⽗进程可以⾃定义SIGCHLD信号的处理函数,这样⽗进程只需专⼼处理⾃⼰的⼯作,不必关⼼⼦进程了,⼦进程终⽌时会通知⽗进程...事实上,由于UNIX的历史原因,要想不产⽣僵⼫进程还有另外⼀种办法:⽗进程调⽤sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的⼦进程在终⽌时会⾃动清理掉,不会产⽣僵⼫进程...在函数内部有一个 while 循环,循环条件是 (id = waitpid(-1, NULL, WNOHANG)) > 0: waitpid 函数用于等待子进程状态改变并获取相关信息,这里的参数...是一个宏,它使得 waitpid 函数在没有已终止的子进程可等待时立即返回,而不是阻塞等待。...循环结束后(也就是没有已终止的子进程可等待了),通过 printf 打印出当前进程(也就是父进程)的进程ID,表示子进程已经退出完毕,当前提示信息所在的进程(父进程)还在运行(printf("child

    9510

    玩转iOS“宏定义”

    ,首先__COUNTER__在每次宏替换时都会进行自增,##是一种宏中专用的特殊符号,用来将参数拼接到一起,但是需要注意,使用##符号拼接的如果是另外一个宏,则其会阻止宏的展开,因此我们定义了一个转换宏...如果你一下子不能理解为什么这样就可以解决宏展开的问题,你只需要记住这样一条宏展开的原则:如果形参有使用#或##这种处理符号,则不会进行宏参数的展开,否则先展开宏参数,在展开当前宏。...多语句功能性宏,要使用do-while包裹       这条原则看上去有些莫名其妙,但是其非常重要,例如,我们需要编写一个自定义的LOG宏,在进行打印时添加一些自定义的信息,你或许会这样写: #define...: 在展开宏的过程中会先将参数进行展开,如果使用##对参数进行了拼接或使用#进行了处理,则此参数不会被展开。...(0) NSAssert宏定义中使用到了不定参数拼接消除逗号的技巧,并且是多行宏语句使用do-while进行优化的一个实践。

    3.6K11

    vue源码中的nextTick是怎样实现的

    这是为什么,什么原因引起这个BUG。Vue 官方是这么解释的 点击事件是宏任务,上的点击事件触发 nextTick(微任务)上的第一次更新。在事件冒泡到外部div之前处理微任务。...为了解决这个问题,您可以简单地给两个外部div不同的键,以强制在更新期间替换它们。这将阻止接收冒泡事件。...点击事件是个宏任务,当点击事件执行完后触发的 nextTick(宏任务)上的更新,只会在下一个事件循环中进行,这样其事件冒泡早已执行完毕。就不会出现 BUG 中的情况。...但是过不久,实现 timerFunc 的顺序又改为 Promise,MutationObserver,setImmediate,setTimeout,在任何地方都使用宏任务会产生一些很奇妙的问题,其中代表...为什么呢,回到 #6566 BUG 中。由于micro task的执行优先级非常高,在 #6566 BUG 中比事件冒泡还要快,就会导致此 BUG 出现。

    60510

    JavaScript中的单线程运行,宏任务与微任务,EventLoop

    所以,在一行代码的执行过程过,必然不会执行另一行代码的,就行你在使用了alert(1)以后在后面疯狂的console.log(),如果执行到 alert(1),你没有关闭这个弹窗,后面的console.log...setTimeout 是宏任务的异步,Promise.then()是微任务的异步,微任务是优先于宏任务执行的,所以,此时会先跳过 setTimeout 任务,执行两个 Promise.then() 的微任务...所以,我们上面的分析步骤是正确的。 但是有一个问题,什么呢?可以看到,在浏览器中,会有一个 undefined 的返回值。为什么呢?...(countdonn--) { } // 我们确保这个循环的执行速度会超过定时器的倒计时,导致这轮循环没有结束时,setTimeout已经可以执行回调了,所以会先执行`setTimeout`再结束这一轮循环...也可以实现相同的效果 上面的为什么有这样的解决方法,从上面的定义中就可以看出来。

    3.4K42

    Js异步机制的实现

    callback,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。...var i = 3000000000; while(--i) { } console.log("循环执行完毕"); 本地测试,设置的setTimeout回调函数大约在30s之后才执行,远远大于4ms...,我在主线程设置了一个非常大的循环来阻塞Js主线程,注意我并没有设置一个死循环,假如我在此处设置死循环来阻塞主线程,那么设置的setTimeout回调函数将永远不会执行,此外由于渲染线程与JS引擎线程是互斥的...,Js线程在处理任务时渲染线程会被挂起,整个页面都将被阻塞,无法刷新甚至无法关闭,只能通过使用任务管理器结束Tab进程的方式关闭页面。...Event Loop 主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop,Event Loop是一个执行模型,在不同的地方有不同的实现,浏览器和NodeJS

    2.8K20

    Event Loop 可视化解析讲解

    并且能够在某个函数结束后,利用存储在栈帧中的信息,执行剩余的代码。使得JS应用拥有记忆。 当JS代码第一次被执行时,此时的调用栈是「空的」。...在修改数据之后立即使用这个方法,获取更新后的 DOM。...Vue.nextTick(callback) 使用原理:Vue 是异步执行(会被推入到宏任务队列中)dom更新的,一旦观察到数据变化,Vue就会开启一个队列,然后把在同一个事件循环 (event loop...❝V8 会为每个宏任务维护一个微任务队列 ❞ 同时,微任务被执行的时机,是在V8要销毁全局代码的环境对象,此时会调用环境对象的「析构函数」 (这是C++的一个概念),此时,V8 会检查微任务队列,如果微任务队列中存在微任务...在promise中抛出错误时,因为错误实际上是从消息队列中异步抛出的,所以并不会阻止运行时继续执行同步指令。

    56641

    【C语言】内联函数总结

    为什么需要内联函数 在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。...,使用inline修饰带来的好处我们表面看不出来,其实,在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i % 2 > 0) ?...关键字来修饰,只有当程序结束时候才会释放掉,使用static inline修饰时,函数仅在文件内部可见,不会污染命名空间,另外,函数在运行过程中也会分配内存空间,但是由于static的存在,就和修饰变量类似...inline函数其实就是空间换时间 inline 和宏的区别 虽然inline函数和带参数的宏很像,但是在使用方法上和宏还是有很大区别的: inline()函数 带参数的宏 展开的时机 在编译的时候展开...,因此在使用带参数的宏时会有一些副作用,编写程序是要人为预防 是否允许有复杂语句 不允许出现复杂语句,如果出现复杂语句,该函数将不会展开,例如递归,大型循环等 对此不做要求。

    40510

    17.计算机科学导论之计算理论学习笔记

    while(X) { decr(X) incr(Y) } 示例5.模拟简单语言中的宏,我们可使用加法宏因为整数的乘法可以用重复的加法来模拟,注意我们需要把X的值保存在一个临时变量中,因为在每次的加法中我们需要把的原始值加到...WeiyiGeek.incr(X)语句的图灵机图 2.decr(X)语句的图灵机 此处,我们使用最小的指令数目来实现decr(X)语句, 其原因是我们在下一条语句(while循环)中要用到这个语句,它也被用来实现所有的宏...WeiyiGeek.decr(X)语句的图灵机图 3.while语句的图灵机 为了模拟循环,我们假定X和循环体处理的数据存储在磁带上,中间以单个空白字符相隔,三个状态 Si、S和 S;控制了循环,它通过判断的值...状态 M把读/写头移过在每次重复中在处理数据开始时定义了数据开始位置的空白符号:状态M把读/写头移过在每次重复中在处理数据结束时定义了X的开始位置的空白符号;状态Bs定义了循环体的开始状态,而状态 B定义了循环体的停机状态...一个重复结构可能永远都不会结束(停机),这就是说一个含有无限循环的程序可以永远运行,但是程序开发者通常需按照需求进行设置跳出循环条件,否则可能导致死循环(严重时会导致系统崩溃)。

    54520

    JS是单线程,你了解其运行机制吗?

    而且主线程只有在将当前的消息执行完成后,才会去取下一个消息。这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。...事件循环用代码表示大概是这样的: while(true) { var message = queue.get(); execute(message); } 那么,消息队列中放的消息具体是什么东西...(又称为微任务),可以理解是在当前 task 执行结束后立即执行的任务 也就是说,在当前task任务后,下一个task之前,在渲染之前 所以它的响应速度相比setTimeout(setTimeout是task...的优先级高于Promise,也就是可以简单理解为:在宏任务结束后会先执行微任务队列中的nextTickQueue部分,然后才会执行微任务中的Promise部分。...但是最终的实践证明:在第一个循环里,process.nextTick1和promise then这两个microTask是在setTimeout这个macroTask里之前输出的,这是为什么呢?

    2.1K20

    JavaScript Event Loop

    这就是为什么当浏览器解析 JavaScript 代码时为什么会阻塞页面渲染,因为这两个事务在同一个线程里。...在事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。被处理的消息会被移出队列,并作为输入参数来调用与之关联的函数。调用一个函数总是会为其创造一个新的栈帧。...而我们在写动画时,常常使用 setTimeout 来实现(当然,现在一般是使用 requestAnimationFrame),比如下面的函数会让一个 div 盒子一直进行显示和隐藏动画: var div...在浏览器端一次只取一个宏任务),每个宏任务阶段(是阶段,一共有六个阶段)执行完毕后,开始执行微任务,再开始执行下一阶段的宏任务,以此构成事件循环。...setImmediate: 在当前回合的 Node.js 事件循环结束时调用的函数。而 process.nextTick() 函数是在事件循环开始之前执行。

    1.3K20

    Python打牢基础,从12个语法开始!

    :返回一个片段,冒号前后分别为开始下标和结束下标 # 包括开始下标,但不包括结束下标 # 因此c[1:5]表示,返回下标从1到4的片段,即第二个到第五个字符 print c[1:5] # 冒号前后的下标同样可以使用负数...连续相同缩进水平的代码处于同一个代码块,在使用 for 、 while 、 if 、 try 等语法时需要注意每行代码的缩进。...while 循环 while 循环的思想是,只要某一条件成立,就不断执行循环体里的代码,直到条件不再成立。...flag = 1 while flag < 10: print flag # 一定要记得在循环体里修改条件变量 # 否则可能导致死循环 flag += 1 for 循环...for 循环的循环次数一般是事先预知的,将一个标志变量从某个起始值迭代到某个终止值后即结束。

    78110

    C语言中的宏定义

    宏定义中的do-while循环do do循环必须始终随跟着一个分号,因此我们不会遇到在if语句中使用宏那样的问题了。...becomes do { gets(str); puts(str); } while (0); */ 为什么在宏定义时需要使用do-while语句呢?...当使用do{ }while(0)时由于条件肯定为false,代码也肯定只 执行一次, 肯定只执行一次的代码为什么要放在do-while语句里呢? 这种方式适用于宏定义中存在多语句的情况。...if后面有两个语句,这样是无法编译通过的,那为什么非要do-while而不是简单的用{}括起来呢。...所以一般的多表达式宏定义中都采用do-while(0)的方式。 3. "空操作"的定义 了解了do-while循环在宏中的作用,再来看"空操作"的定义。

    6.5K10

    JS事件循环之宏任务和微任务

    众所周知,JS 是一门单线程语言,可是浏览器又能很好的处理异步请求,那么到底是为什么呢? JS 的执行环境一般是浏览器和 Node.js,两者稍有不同,这里只讨论浏览器环境下的情况。...:先执行一个宏任务,执行过程中如果产出新的宏/微任务,就将他们推入相应的任务队列,之后在执行一队微任务,之后再执行宏任务,如此循环。...以上不断重复的过程就叫做 Event Loop(事件循环)。 每一次的循环操作被称为tick。 ?...输出script end 宏任务第一个执行结束 当前任务队列:微任务[then1],宏任务[timeou1, timeout2] 微任务: 执行 then1,输出then1 微任务队列清空 当前任务队列...,但是因为then中的在while操作被延迟了4s,所以一直推迟到了4s秒后才执行的setTimeout。

    1.2K10

    C++入门(2)

    3、没有类型安全的检查 那么 就可以使用enum const inline 替代宏  enum const -> 宏常量  inline ->宏函数 宏函数的优点就是不用建立栈帧,提高效率。...8.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么?...在for里面会自动取数组里面的值赋值给e,自动判断结束,自动++。 如果想要修改数组里面的值,在auto后面使用引用就可以了。...,可以用 continue 来结束本次循环,也可以用 break 来跳出整个循环 。...为了提高代码的健壮性,在后续表示指针空值时建议最好使用 nullptr 。 今天的分享到这里就结束了,感谢大家的阅读!

    10910

    【C++修行之道】引用、内联函数、auto关键字、for循环(C++)、nullptr(C++11)

    ptr的地址,使用时再解引用 cout << r << endl; // 此时开始解引用,在访问时会报错 } 1.3 常引用 void TestConstRef() { const int...f@@YAXH@Z),该符号在函数 _main 中被引用 【面试题】 宏的优缺点? 优点: 1.增强代码的复用性。 2.提高性能。 缺点: 不方便调试宏。...3.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么?...为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法 4. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有 lambda表达式等进行配合使用...,可以用continue来结束本次循环,也可以用break来跳出整个循环。

    6000
    领券