浏览器线程有哪些

浏览器中包含什么?三个常驻线程?

浏览器基础结构主要包含七个部分:

  • 用户界面:用户所看到的内容和与之交互的功能组件,比如按钮、表单等等
  • 浏览器引擎:负责控制和管理下一级的渲染引擎
  • 渲染引擎:解析用户请求的内容并返回
  • 网络:负责处理网关相关事宜,比如http服务
  • UI后端:负责绘制一些提示框等UI组件,底层使用的是操作系统的用户接口
  • js解析器:负责解析和执行js代码
  • 数据存储:负责存储数据如cookie等

浏览器是多线程的,js是单线程的,浏览器至少包含三个常驻线程:

js引擎线程:基于事件驱动单线程执行

GUI渲染线程:负责渲染浏览器界面。但是js引擎线程和GUI渲染线程是互斥的,当js引擎线程进行时,GUI渲染线程会暂停,直到js引擎线程结束才继续,这也就是js阻塞

事件触发线程:当事件被触发后,会把事件添加到任务队列的最尾端,等待js引擎处理执行

浏览器内核是多线程的,在内核控制下各线程相互配合以保持同步,一个浏览器通常由以下常驻线程组成 [^1]: - **GUI 渲染线程**:负责渲染浏览器界面,解析 HTML、CSS,构建 DOM 树和 CSSOM 树,合并生成渲染树,进行布局计算和绘制等操作,将网页内容呈现给用户。 - **定时触发器线程**:处理 `setTimeout` 和 `setInterval` 等定时任务。由于 JavaScript 是单线程执行的,为了防止这些定时任务影响主线程的执行,专门有此线程负责计时,当计时结束时将相应的回调函数放入任务队列等待执行。 - **事件触发线程**:当事件(如点击、鼠标移动等)被触发时,该线程会将相应的事件处理程序添加到任务队列中,等待 JavaScript 引擎线程执行。 - **异步 HTTP 请求线程**:处理异步的 HTTP 请求,如 `XMLHttpRequest` 或 `fetch` 请求。当请求完成后,将回调函数放入任务队列等待执行。 - **JavaScript 引擎线程**:负责执行 JavaScript 代码。由于 JavaScript 是单线程的,该线程一次只能执行一个任务,因此会阻塞其他任务的执行。 ### 示例代码 以下是一个简单的示例,展示了不同线程的协作: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> #myButton { padding: 10px 20px; background-color: blue; color: white; } </style> </head> <body> <button id="myButton">Click me</button> <script> // 事件触发线程处理点击事件 document.getElementById('myButton').addEventListener('click', function () { console.log('Button clicked'); // 定时触发器线程处理定时任务 setTimeout(function () { console.log('Timeout executed'); }, 2000); }); // 异步 HTTP 请求线程处理异步请求 fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .then(data => console.log(data)); </script> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值