0
点赞
收藏
分享

微信扫一扫

事件的循环

RJ_Hwang 2022-04-26 阅读 109

线程和异步

进程

当一个应用程序运行时,需要使用内存和CPU资源,这些资源需要向操作系统申请。

操作系统以进程的方式来分配这些资源,一个进程就代表着一块独立于其他进程的内存空间。

一个应用程序要运行,必须至少有一个进程启动。

进程的最大特点是独立,一个进程不能随意的访问其他进程的资源。这就保证了多个程序在操作系统上运行互不干扰。

线程

任何一个进程在启动的时候,操作系统都会给其分配一个线程,应用程序的入口函数在主线程中运行。

在应用程序的运行过程中,可能有多个任务需要同时执行,于是可以向操作系统申请分配更多的线程来执行不同的任务。

比如,浏览器启动后,会开启多个线程来处理不同的事情。

和进程不一样的是,线程之间的资源不是隔离的,它们可以共享数据,并且线程可以被调度。

比如浏览器中的执行线程和GUI线程就是被调度为互斥的,当GUI线程执行渲染时,执行线程会被阻塞,反之亦然。所以在下面的代码中你是看不到元素内容被改变的:

<h1 id="title">Monica</h1>
<button onclick="test()">click me</button>
<script>
  function test() {
    title.innerHTML = "莫妮卡";
    while (true) {}
  }
</script>

我们所说的「JS中是单线程」的语言,是指在宿主环境中,执行JS代码的线程只有一个

异步

单线程的主要优势是不需要考虑线程调度,降低了程序的复杂性

但在单线程中如果要处理需要等待的任务时,就必须要考虑阻塞的问题。

考虑下面的伪代码:

var dom = document.getElementById("name"); // 获取某个dom元素
var name = syncConnect("http://server/getname"); // 以同步的方式向服务器获取名字
dom.innerHTML = name;
otherTask(); // 其他无关任务

因此,JS引入异步来处理该问题

var dom = document.getElementById("name"); // 获取某个dom元素
asyncConnect("http://server/getname", function (result){ //以异步的方式向服务器获取名字
  var name = result;
  dom.innerHTML = name;
}); 
otherTask(); // 其他无关任务

执行栈

事件循环

不在这里介绍了
在这里插入图片描述

举报

相关推荐

0 条评论