线程,是程序执行流的最小单位。线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行。线程有就绪,阻塞,运行三种基本状态。

阮一峰大神针对进程和线程的类比,很是形象:计算机的核心CPU,是个工厂,时刻运转着,工厂里有很多个车间(进程),一个车间开工其他车间不能开工,就是说:单核CPU一次只能运行一个进程。任何时候,CPU总是运行一个进程。

而一个车间里面有很多工人(线程),协同完成一个任务。所以:一个进程可以包括多个线程。车间空间是工人共享的,一个进程中的内存空间是所有线程共享的。

但是房间大小不同个,容纳量不同,有些线程进去了,其他线程就不能再进去使用了。这就是:一个线程使用某些共享内存时,其他线程得等它结束后才能使用共享内存。

内存可以上锁,防止其他线程进来,【互斥锁】也就是防止多个线程读写同一块内存区域。

还有些共享内存比较大,可以容纳多个线程,但是也是有限的,只能容纳固定数目的线程使用。如何保证多个线程不冲突呢?内存门口有个钥匙架,如果发现钥匙架空了,那就不能再进去了【信号量】。

事件循环(Event Loop):

JavaScript是单线程的,单线程意味着需要一个任务队列来管理任务事件,任务分为两种:同步任务和异步任务。同步任务是在主线程上面排队执行的任务,只有前面任务完成,下一个任务才能执行。异步任务是不进入主线程,而是进入任务队列中,只有通知主线程某个异步任务可以执行了,该任务方可执行。

同步任务在主线程执行形成一个执行栈,主线程之外有个任务队列(鼠标点击事件,键盘点击事件,网络请求),只要异步任务触发,在任务队列中放置一个事件,等执行栈中同步任务完成后,系统才会读取任务队列执行异步任务。主线程会重复去任务队列中读取任务并执行——事件循环。

任务队列是“先进先出”的数据结构,先来的优先被主线程读取。

主线程运行产生堆heap和栈stack,栈里面是各种同步方法,栈里面代码执行完毕主线程会读取任务队列,依次执行事件的回调函数。

所以,栈里面的同步任务总是在任务队列之前执行。

看个定时器的例子:

console.log(1);
setTimeout(function(){console.log(2);},0);
console.log(3);

定时器里面的第二个参数延迟时间设置为0或者比0小的数,输入都是1,3,2。因为console.log(1)和console.log(3)在主线程执行,而定时器是个异步任务放在了任务队列里面,只有栈中的同步事件清空后才能执行任务队列中的回调函数。

setTimeout(fn,0)意思是:fn在主线程最早可得的空闲事件执行,但是也得等主线程的同步任务和任务列表中排在它前面的事件都处理完才能执行它。

要注意的点是:setTimeout里面指定的延迟时间执行并不能保证就是那个时间执行,必须等到排在它之前的任务队列中的回调函数执行完毕后才能执行它。

————————————————————————————————————————————————

JavaScript是单线程,H5中的Web Worker作用就是给js创造多线程环境,允许主线程创建Worker线程,将一些任务分配给Worker运行,主线程运行同时,Worker线程在后台运行,互不干扰。等Worker线程完成计算任务,再把结果返回给主线程。主线程(通常负责UI交互)就不用被异步队列所打扰,运行就比较流畅。

使用Web Worker要注意的点:

1,同源限制:分配给Worker线程执行的脚本必须与主线程脚本同源。

2,DOM限制:Worker无法读取ODM对象。

3,通信限制:Worker与主线程不在一个上下文环境,不能直接通信。

4,脚本限制:不能执行alert,confirm但是可以使用XHR发送Ajax请求。

5,文件限制:无法读取本地文件,加载的脚本必须来源于网络。

Worker线程使用完毕后,为了节省资源必须关闭Worker。

Web Worker有自己的全局对象,不是主线程的window对象,例如:self.name,self.onmessage等。

Worker的应用场景:轮询。

这样看来Web Worker其实就是主线程的一个子线程,帮忙处理一些任务队列里面的事件,分担主线程的任务压力。

【完】

只有不悲不喜的人,能当得起大喜大悲。也只有无所谓得失,不等待回音的人,能攀上人生的高峰。

进程,线程,Event Loop(事件循环),Web Worker的更多相关文章

  1. javascript的event loop事件循环

    javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.lo ...

  2. node.js中对Event Loop事件循环的理解

    javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...

  3. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

  4. Event Loop事件循环,GET!

    JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...

  5. 浅谈 Event loop (事件循环)

    从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...

  6. js event loop事件循环

    浏览器环境 以下两段代码是等价的.req对事件的回调设置,实际上就是当前主线程任务队列的任务. var req = new XMLHttpRequest(); req.open('GET', url) ...

  7. JavaScript event loop事件循环 macrotask与microtask

    macrotask  姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. mic ...

  8. Evevt Loop 事件循环

    目录 JavaScript 是一门单线程的语言 一.什么是event Loop的执行机制 练习 异步任务-setTimeout 练习1: 练习2: 练习3: 练习4: 二 事件队列作用 同步任务 例1 ...

  9. JavaScript Concurrency model and Event Loop 并发模型和事件循环机制

    原文地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop JavaScript 有一个基于 event loop 的 ...

随机推荐

  1. Andriod常用控件介绍&相关属性(初学方便查询)

    一.TextView(显示控件) android:id(给当前控件定义唯一的标识符)——示例:android:id = "@+id/text_view" android:layou ...

  2. centos7 ModuleNotFoundError: No module named 'users'

    centos7下运行django项目时ModuleNotFoundError: No module named 'users' 由于我的项目目录是下面这样: 因为找不到users的路径 所以在mana ...

  3. 70)PHP,cookie的安全传输和HTTPonly

    (1)是否仅安全传输:

  4. EntityNotFoundException EntityExistException

    package me.zhengjie.common.exception; import org.springframework.util.StringUtils; import java.util. ...

  5. icloud/onenote/onedrive/microoutlook/百度云账号都是怎么回事(未完成)

    在用一些跨机器跨平台软件的时候,一旦换了电脑或者手机,我经常出现蒙的状态,不知道怎么同步或者使用了,在这里总结一下. 一.icloud账号 当我们买iphone或者macbook的时候,一开机它会让你 ...

  6. 数位dp——BZOJ1026 Windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻 ...

  7. 使用Hangfire MVC 做排程

    Greg Yang Developer Taipei, Taiwan 108 POSTS 35 TAGS 所使用的是 Hangfire 強大排程器有 UI介面可以使用. 首先安裝PM> Inst ...

  8. 最简化的DirectX 11开发环境的配置 VS2010

    转载自:http://blog.csdn.net/zhmxy555/article/details/7672101 在编写基于DirectX 11的应用程序之前,我们当然需要在IDE中加入Direct ...

  9. 吴裕雄--天生自然python学习笔记:beautifulsoup库的使用

    Beautiful Soup 库简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简 ...

  10. 双股同时上市!小米IPO是想要玩场大的?

    ​近日,据相关媒体报道,有相关人士称小米IPO最终可能敲定A+H股两地发行.但目前还未得到小米官方证实.此前关于小米要上市的消息已经流传已久了,从雷军刚开始的矢口否认到后来的默认,再到后来相关消息愈来 ...