什么是异步(java与js中异步操作的区别)

什么是异步(java与js中异步操作的区别)

本文简略介绍了java和js中异步的区别

 次点击
3 分钟阅读

JavaScript 的异步是“老板(主线程)接客,任务外包给外包公司(宿主环境 API),做完了外包公司打电话(事件循环)通知老板”;
Java 的异步是“老板(主线程)养了一个团队(线程池),来了耗时任务就直接派给底下的员工(子线程),任务干完再向老板汇报”。

1. 什么是异步 (Asynchrony)?

在理解异步之前,先理解同步 (Synchronous)。

  • 同步(阻塞):代码按顺序执行。如果遇到一个耗时操作(比如读取大文件、请求网络),程序会阻塞等待,直到操作完成才会继续执行。

  • 异步(非阻塞):遇到耗时操作时,程序不会等待它完成,而是直接把它交给系统后台处理,主程序继续往下执行。等后台处理完成后,系统会通过某种机制(如回调、事件)通知主程序拿结果。

2. java 中的异步操作

java中的异步操作主要是通过开启新线程或利用线程池来实现的。主线程把耗时任务打包扔给另一个工作线程,从而实现主线程的非阻塞。

3. javascript中没有多线程,它是通过什么实现异步的?

JavaScript 最初是为浏览器设计的,为了避免多个线程同时修改 DOM(网页结构)导致冲突,它的核心设计是单线程 (Single-threaded)。这就意味着 JS 引擎在任何时刻只能执行一段代码。
这种单线程的环境需要实现异步,可以采用事件循环 (Event Loop) 和宿主环境 (Browser / Node.js) 的配合来解决。
当js遇到异步任务时主线程会把这些任务交给浏览器或 Node.js 的 C++ 底层去处理,然后主线程继续执行后面的任务,宿主环境处理完耗时任务后,会把对应的回调函数塞进任务队列中等待。
事件循环 (Event Loop) 是一个永远在运行的机制。只要执行栈空了,它就会去任务队列里把排队的回调函数拉到执行栈里运行。

© 本文著作权归作者所有,未经许可不得转载使用。