JS线程机制与事件机制

1.进程与线程

(1).定义:

  • 进程:程序的一次执行,它占有一片独有的内存空间

  • CPU的基本调度单位,是程序执行的一个完整的流程

(2).进程与线程的关联

  • 一个进程一般至少有一个运行的线程:主线程

  • 一个进程可以运行多个线程

  • 一个进程内的数据可以供其中的多个线程共享

  • 多个线程之间的数据是不能直接共享的

(3).浏览器基本上是多进程的

2.浏览器内核

(1).定义:支持浏览器运行的最核心的程序

(2).不同的浏览器运行的内核不同

  • Chrome,Safari:webkit

  • firefox:Gecko

  • IE:Trident

  • 国内浏览器360等:Trident + webkit

(3).内核组成的模块:

  • html,css文档解析模块:负责页面文本的解析

  • dom/css模块: 负责dom/css在内存中的相关处理

  • 布局和渲染模块:负责页面的布局和效果的绘制

  • 定时器模块:负责定时器的管理

  • 网络请求模块:负责服务器请求(Ajax)

  • 事件响应模块:负责事件的管理

3.定时器

(1)分类:

  • 循环定时器:不关闭一直执行

  • 延时定时器:一定时间后才执行,只执行一次

(2)循环定时器:setInterval

     var i = 0;
//获得定时器句柄
var intervalId = setInterval(function(){
if (i >= 5) {
//清除定时器
clearInterval(intervalId);
}
console.log(Date.now());
i++;
},1000);

(3)延时定时器:

     setTimeout(function(){
console.log("----");
},2000);

4.JS是单进程的

(1)证明:

  • 使用setTimeout()回调函数在主线程运行

  • 定时器回调函数只有在运行栈中的代码全部执行完毕后才可能执行

(2)为什么js要使用单线程模式:

  作为浏览器的脚本语言主要目的是和用户交互,以及操作DOM,单线程会避免复杂的同步问题

(3)代码分类:

  • 初始化代码

  • 回调代码

(4)JS引擎执行代码的基本流程

  1. 先执行初始化代码:包括一些特别的代码:

    • 设定定时器

    • 绑定监听

    • 发送Ajax请求

  2. 在某一时刻执行回调代码

5.事件循环模型

执行流程:

1.同步任务加载执行

初始化代码:绑定监听,设置定时器,发送ajax请求

2.异步任务交给时间管理模块

3.管理模块监听异步任务是否满足条件,如果满足条件就会将对应的任务放入callback queue中

4.主线程同步任务执行完成后通过event loop(事件轮询机制)询问callback queue

  • 有可执行的回调函数,就将回调函数放入主线程中执行

  • 如果没有待会再来询问

6.Web Workers:(需要开启服务器)

(1)提供了js分线程实现

(2)相关API:

  • Worker:构造函数,加载分线程执行的js文件

  • Worker.prototype.onmessage:用于接收另一个线程的回调函数

  • Worker.prototype.postMessage:向另一个线程发送信息

(3)不足:

  • 不能操作DOM(不能更新UI)

  • 不能跨域加载JS

  • 不是每一个浏览器都支持这个新特性

(4)代码:

在主线程html中编写

 <input type="text" id="number" value="30">
<button id="btn">计算斐波那契数</button>
<script type="text/javascript"> document.getElementById("btn").onclick = function(){
var value = document.getElementById("number").value; //获得分线程
var worker = new Worker("./work.js"); //发送给分线程数据
worker.postMessage(value);
//接收分线程数据
worker.onmessage = function(event){
console.log(event.data);
} }
</script>

在同一级目录下work.js

 function fibonacci(num){
return num > 2 ? fibonacci(num - 1) + fibonacci(num - 2) : 1;
} var onmessage = function(event){
console.log("分线程监视...."); //获取主线程发送过来的数据
var data = event.data; //分线程处理数据
data = fibonacci(data); //返回数据给主线程
postMessage(data);
};

执行结果:

  不会卡住主进程界面,大批量计算在分线程中执行。

JS线程机制与事件机制的更多相关文章

  1. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  2. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

  3. 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)

    IPC  进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化)   一把锁配一个钥匙 l.acquire()  获得钥匙 ...

  4. 剖析Qt的事件机制原理

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...

  5. Atitit  数据库的事件机制--触发器与定时任务attilax总结

    Atitit  数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...

  6. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...

  7. Node js 安装+回调函数+事件

    /* 从网站 https://nodejs.org/zh-cn/ 下载 这里用的 9.4.0 版本 下载完安装 安装目录是 D:\ApacheServer\node 一路默认安装 安装后打开cmd命令 ...

  8. Node.js实战(九)之事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node ...

  9. Node.js入门:事件机制

    Evented I/O for V8 JavaScript     基于V8引擎实现的事件驱动IO.   事件机制的实现     Node.js中大部分的模块,都继承自Event模块(http://n ...

随机推荐

  1. 另一个角度的redis--redis 可以看做是c/s架构的软件

    Redis 通信协议简单研究 redis 可以看做是c/s架构的软件,再打开一个终端输入下面的指令 https://www.cnblogs.com/nele/p/8908298.html redis ...

  2. golang 学习笔记 --基本类型

    字符串值表示了一个一个字符值的集合,在底层,一个字符串值即一个包含了若干字节的序列,长度为0的序列与一个空字符串对应.字符串的长度即底层字节列中字节的个数. 字符串值是不可变的,对字符串的操作只会返回 ...

  3. C# yield checked,unchecked lock语句(C#学习笔记04)

    特殊语句 yield语句 yield用于终止迭代 只能使用在返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator< ...

  4. Ubuntu 下安装zsh和oh-my-zsh

    注意:安装前先备份/etc/passwd 一开始装oh-my-zsh我是拒绝的,因为这东西安装容易,卸载难,真的很难. Mac安装参考:http://www.cnblogs.com/EasonJim/ ...

  5. Java的Stream流式操作

    前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...

  6. Java自学-类和对象 类方法

    Java的类方法和对象方法 类方法: 又叫做静态方法 对象方法: 又叫实例方法,非静态方法 访问一个对象方法,必须建立在有一个对象的前提的基础上 访问类方法,不需要对象的存在,直接就访问 步骤 1 : ...

  7. VC 在桌面上绘制一些图形

    注意:这是在桌面上绘制图形.如果想在VC++ MFC工程的视窗口上绘制图形.可以这么来,在工程View类的一个菜单响应(或者鼠标单击等事件的的响应)函数中添加下面main 中的代码,只需要将“红色字体 ...

  8. js事件【续】(事件类型)

    一.UI事件[使用时需要添加on eg: onload 页面加载完成事件]load    [一张页面或一幅图像完成加载]页面加载后触发的事件,即进入页面后 unload    [用户退出页面]页面卸载 ...

  9. FFMPEG处理音频时间戳的主要逻辑

    来源:http://www.xuebuyuan.com/1466771.html FFMPEG处理音频时间戳的主要逻辑 2013年12月09日 ⁄ 综合 ⁄ 共 2226字 ⁄ 字号 小 中 大 ⁄ ...

  10. Java DbUtils简介

    Dbutils,db utils,顾名思义,是一个数据库工具,体积很小,算是一个dao层的小框架. DbUtils是Apache的开源项目,对JDBC进行了轻量级封装,极大地简化了JDBC编程. Db ...