线程与进程:

进程是系统资源分配和调度的单元。一个运行着的程序就对应一个进程。在windows中,每一个打开的运行的应用程序或后台程序,比如运行中的qq,谷歌浏览器,网易云音乐,资源管理器等都是一个进程。一个进程包括了运行中的程序和程序所使用到的内存和系统资源。比如,边听音乐,边在博客园写博客,这 就是开了两个进程。

线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程。比如网易云一遍播放音乐,一遍显示歌词,网易云是进程,播放音乐和展示歌词是网易云进程下的两个线程。

同步和异步:

同步异步是指程序的行为。同步时程序发出调用的时候,一直等待直到返回结果。没有结果之前不会返回。也就是说,同步是调用者主动等待调用的过程。

异步是发出调用之后,马上返回,但是不会马上返回结果。调用者不必主动等待,当被调用者得到结果之后会主动通知调用者。

上面的概念可能比较官方,不易理解。通俗来说,就是,你去卖煎饼,然后再那等老板做好之后递给你,你才能走的过程 就是同步。你去肯德基点餐,然后点完之后,找个位置坐着玩手机,等做好后之后,前台的小哥哥小姐姐的叫号通知你去拿的过程就是异步。同步就是 只能一件件的事情去做,做完一件,再做一件。而异步不是,异步是你再做一件事的等待过程中,可以去做其他的事情。这就是同步和异步的区分。

console.log()
console.log('同步')
console.log()
//1
//同步
//
console.log()
setTimeout(() => {console.log('异步‘)}, 0)
console.log()
//1
//2
//异步

浏览器是单线程还是多线程?---多线程

一个浏览器通常有以下几个常驻的线程:

- 渲染引擎线程:顾名思义,该线程负责页面的渲染。

- JS引擎: 负责JS的解析和执行

- 定时触发器线程: 处理定时事件,比如setTimeout,setInterval

- 事件触发线程:处理DOM事件

- 异步http请求线程:处理http请求

浏览器只分配给Js一个主线程,用来执行任务,但是一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但是,前端的某些任务是很消耗时间的,如果,让他们和别的任务一样,都老老实实的排队等待执行,执行效率就会非常的低,甚至导致页面的假死。所以,浏览器为了这些耗时任务,就开辟了另外的线程,如: http请求,浏览器定时触发器等,这些任务 都是异步的,

那js 的单线程和异步 是不是有点自相矛盾呢?单线程和异步确实不能同时为一个语言的特性,js 选择了成为单线程语言,所以它本身不可能是异步的,但Js的宿主浏览器,Node等是多线程的,宿主环境通过某种方式使得Js具备了异步的属性。

任务队列

js任务分为同步任务和异步任务,同步任务指的是,在主线程上排队执行的任务,只有钱一个任务执行完毕,才能执行后一个任务。异步任务:不进入主线程,而进入“任务对列”的任务,只有“任务队列”通知主线程,某个异步任务可以执行了。该任务才会进入主线程执行。

异步执行的运行机制:

- 所有的同步任务都在主线程上,形成一个【执行栈】

- 主线程之外,还存在一个“任务队列”。只要异步任务有了运行结果,就在“任务队列”之中放置一个事件。

- 一旦“执行栈”种的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

- 主线程不断重复上面的第三步。

回调函数

当主线程开始执行异步任务,就是执行对应的回调函数。

异步任务必须指定回调函数。

js中的异步之定时器

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

当有耗时任务的时候,会把它放在任务队列中等待主线程空闲然后再执行。实际再执行的过程中,浏览器会默认setTimeout以及ajax请求这一类的方法都是耗时程序(尽管可能不耗时)。所以此时的setTimeout尽管它推迟时间为0,但是js不会立即执行,而是把它加入任务队列,当执行完执行栈的同步任务也就是打印1后,再执行setTimeout的回调函数,打印0。

setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行。划重点::: 尽早可能。也就是说setTimeout 将当前的回调函数加入到任务队列中,当前任务耗时过长,需要等很久,灭有办法保证,回调函数会在指定的时间内执行。

js 单线程 异步的更多相关文章

  1. js的异步和单线程

    最近,同事之间做技术分享的时候提到了一个问题"js的异步是另开一个线程吗?"当时为此争论不休.会后自己查阅了一些资料,对这个问题进行一个自我的分析与总结,有不同意见的希望可以赐教, ...

  2. 探秘JS的异步单线程

    对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异.而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的. 我曾尝试用“ ...

  3. 【本周面试题】第2周 - js单线程和异步相关问题

    硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...

  4. JS定时器和单线程异步特性

    首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码.具体函数: setTimeout(callback, delay);/ ...

  5. 【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

    转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93% ...

  6. JS的异步世界

    前言 JS的异步由来已久,各种异步概念也早早堆在开发者面前.可现实代码中,仍然充斥了各种因异步顺序处理不当的bug,或因不好好思考,或因不了解真相.今天,就特来再次好好探索一番JS的异步世界. 01 ...

  7. JS 单线程

    js单线程阻塞实例setTimeout(function () { while (true) { } }, 1000);setTimeout(function () { alert('end 2'); ...

  8. JS的异步模式

    JS的异步模式:1.回调函数:2.事件监听:3.观察者模式:4.promise对象 JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous) ...

  9. 单线程异步回调机制的缺陷与node的解决方案

    一.node单线程异步的缺陷: 单线程异步的优点自然不必多说,node之所以能够如此快的兴起,其单线程异步回调机制相比于传统同步执行编程语言的优势便是原因之一.然而,开发一个node程序,其缺陷也是不 ...

随机推荐

  1. 使用log4j将日志输送到控制台、文件或数据库中

    转: 使用log4j将日志输送到控制台.文件或数据库中 2018-09-07 00:45:08 keep@ 阅读数 2880更多 分类专栏: 其它   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  2. VMWare-Linux NAT模式联网配置

    VMWare-Linux NAT模式联网配置   摘自:https://blog.csdn.net/a56112777/article/details/83053566 (注意使用root用户) 1. ...

  3. 转 【MySQL】常用拼接语句 shell 下执行mysql 命令

    [MySQL]常用拼接语句 前言:在MySQL中 CONCAT ()函数用于将多个字符串连接成一个字符串,利用此函数我们可以将原来一步无法得到的sql拼接出来,在工作中也许会方便很多,下面主要介绍下几 ...

  4. ubuntu下vs code配置c++

    链接地址:https://blog.csdn.net/u010648921/article/details/82628616 摘要:Ctrl+Shift+B, F5

  5. 数据库分库分表中间件ShardingSphere推荐

    官网链接:http://shardingsphere.io/document/current/cn/overview/ 源起: 我今天首先去了解了一下国内好像是比较火的一个叫"MyCat&q ...

  6. 静态站点生成器-md-vue-vuepress

    推荐指数:

  7. 【Leetcode_easy】860. Lemonade Change

    problem 860. Lemonade Change solution class Solution { public: bool lemonadeChange(vector<int> ...

  8. CF1281B Azamon Web Services

    思路: 贪心,找到将s至多交换一次所能得到的字典序最小的字符串,再与c比较. 实现: #include <bits/stdc++.h> using namespace std; int m ...

  9. Semi-supervised learning for Text Classification by Layer Partitioning

    本文是arxiv上一篇较短的文章,之所以看是因为其标题中半监督和文本分类吸引了我.不过看完之后觉得所做的工作比较少,但想法其实也挺不错. 大多数的半监督方法都选择将小扰动施加到输入向量或其表示中,这种 ...

  10. [转帖]鲁大师Q3季度PC处理器排行:AMD、Intel终于五五开了

    鲁大师Q3季度PC处理器排行:AMD.Intel终于五五开了 https://www.cnbeta.com/articles/tech/902375.htm 近日,鲁大师发布了Q3季度PC处理器排行. ...