JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解

简介: JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解

JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解

javascript中有很多需要知道的概念,尤其是标题中列出来的这些,今天就来过一下这些概念。

一、进程和线程

浏览器的每一个tab页可以看做是浏览器内核进程,每个进程下面会有多个线程来互相配合完成任务

比如 GUI线程、JS引擎线程、网络线程、定时器线程等

二、任务队列

任务队列可以当做是一个个的对调任务,当主线程的任务完成后,就开始执行任务队列中的任务(如果当前任务队列中再添加了新的异步任务,则其回调函数会放在之后的任务队列中)

三、事件循环

异步任务执行后,其回调会放到任务队列中。当主线程任务执行结束后,就去任务队列中捞接下来要做的任务,放到主线程中执行,直到任务全部结束。如果无新的任务可做,浏览器处于等待状态,知道新的外部输入、事件触发,这样一个循环过程称为事件循环。

四、宏任务和微任务

任务队列中有两种任务,一种是宏任务一种是微任务。具体概念我也没有查到,但是可以这样去理解,微任务就是执行完当前主线程任务后就要马上执行的任务,宏任务则是要放到下一次的事件循环中的主线程中的任务。

一般的宏任务有setTimeout和setInterval

微任务则有promise、process.nextTick等

五、执行栈

执行栈是解释器追踪函数执行流的一种机制。当引擎第一次遇到js代码时,会产生一个全局执行上下文压入执行栈,每遇到一个函数调用,就往栈中压入一个新的上下文。引擎执行栈顶的函数后则弹出当前执行上下文直至函数依次执行完毕并回到全局的上下文。

测试

有兴趣的同学可以试试下面代码的输出顺序

setTimeout(function () {
   console.log('1')
  });
new Promise(function (resolve) {
  console.log('2');
   resolve();
  }).then(function () {
   console.log('3')
   setTimeout(function () {
​    console.log('5')
   });
  });
console.log('4');

遇到第一个settimeout时,先把整体代码块放到第一个宏任务中,遇到promise,先执行内部的代码,把then中的代码放到为任务中。遇到console.log(4)在主线程中直接执行。之后先从微任务中捞取任务执行 console.log(3)并把后面的setTimeout放到下一个宏任务队列(第二个)中。然后从当前宏任务队列中捞取要执行的代码,打印1。然后开始到下一个事件循环,把宏任务的代码捞出来执行。

所以顺序是24315

相关文章
|
12天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
3天前
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
12 3
|
3天前
|
Java 调度
多线程的基本概念和实现方式,线程的调度,守护线程、礼让线程、插入线程
多线程的基本概念和实现方式,线程的调度,守护线程、礼让线程、插入线程
13 0
|
7天前
|
安全 Java
Java中的多线程编程:概念、实现及性能优化
【5月更文挑战第20天】在计算机科学中,多线程是一种允许程序同时执行多个任务的技术。Java作为一种广泛使用的编程语言,提供了对多线程编程的支持。本文将介绍Java中多线程的基本概念、实现方法以及性能优化策略,帮助读者更好地理解和应用多线程技术。
|
10天前
|
JavaScript 前端开发
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
前端 JS 经典:宏任务、微任务、事件循环(EventLoop)
18 0
|
10天前
|
Java 测试技术 Python
Python的多线程允许在同一进程中并发执行任务
【5月更文挑战第17天】Python的多线程允许在同一进程中并发执行任务。示例1展示了创建5个线程打印"Hello World",每个线程调用同一函数并使用`join()`等待所有线程完成。示例2使用`ThreadPoolExecutor`下载网页,创建线程池处理多个URL,打印出每个网页的大小。Python多线程还可用于线程间通信和同步,如使用Queue和Lock。
33 1
|
10天前
|
机器学习/深度学习 PyTorch 算法框架/工具
神经网络基本概念以及Pytorch实现,多线程编程面试题
神经网络基本概念以及Pytorch实现,多线程编程面试题
|
12天前
|
JavaScript 前端开发 测试技术
编写JavaScript模块化代码主要涉及将代码分割成不同的文件或模块,每个模块负责处理特定的功能或任务
【5月更文挑战第10天】编写JavaScript模块化代码最佳实践:使用ES6模块或CommonJS(Node.js),组织逻辑相关模块,避免全局变量,封装细节。利用命名空间和目录结构,借助Webpack处理浏览器环境的模块。编写文档和注释,编写单元测试以确保代码质量。通过这些方法提升代码的可读性和可维护性。
21 3
|
12天前
|
Linux API 调度
进程,任务
进程,任务
14 1
|
12天前
|
存储 安全 Linux
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
13 0