资讯专栏INFORMATION COLUMN

javascript:多线程与伪线程

genefy / 2345人阅读

摘要:伪线程重点浏览器的内核是多线程的,一个浏览器一般至少实现三个常驻线程引擎线程,渲染线程,浏览器事件触发线程。当我们要循环过百万级的数据甚至亿的时候怎么办那就用模拟一个多线程。

web worker

这里就不多说了,主要说伪线程。因为web worker不能操作dom元素,很多时候用不上。

伪线程

重点:
浏览器的内核是多线程的,一个浏览器一般至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。

a.javascript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行JS程序。
b.GUI渲染线程负责渲染浏览器界面,当界面需要重排、重绘或由于某种操作引发回流时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
c.事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

当我们要循环过百万级的数据甚至亿的时候怎么办?
那就用setTimeout模拟一个多线程。
重点:js的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。即使setTimeout为0,他也是等js引擎的代码执行完之后才会插入到js引擎线程的最后执行。
上栗子

var thread = function () {
    var nowTime = 0, //线程已经执行了多久
        maxTime = 15;//线程最多执行多久
    var threadArr = [];//数组模拟线程队列
    
    this.addThread = function (fn) {
        threadArr.push(fn)
    }
    this.start=function () {
        doingThread();
    }
    var doingThread = function () {
        if (threadArr.length > 0) {
            if (nowTime < maxTime) {
                let now = new Date().getTime();
                var method = threadArr[0];
                method();
                threadArr.splice(0, 1);
                let nowNew = (new Date().getTime() - now);
                nowTime += nowNew;
                doingThread();
            } else {//每执行完线程后睡1ms
                nowTime=0;
                setTimeout(doingThread, 1);
            }
        }else {//先睡着等待线程队列
            setTimeout(doingThread,100)
        }
    }
}
var fn = function (num) {
    console.log(num)
}

var thread = new thread();
thread.start()
for (let i = 0; i < 1000000; i++) {
    thread.addThread(function () {
        fn(i)
    })
}

循环百万级的数据量并且不阻塞Ui线程是完全没问题的,但过亿浏览器还是会蹦。(这里只是提供个简单的思路,其实过亿也可以不蹦)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82052.html

相关文章

  • 浏览器的进程与线程详解

    摘要:浏览器的渲染进程浏览器内核,是多线程的,主要以下几大类线程引擎线程事件触发线程定时器线程网络请求线程线程负责渲染浏览器界面元素当界面需要重绘或由于某种操作引发回流时该线程就会执行。 进程 进程是cpu的资源分配的最小单位。 多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如你可以听歌的同时,打开编辑器敲代码,编...

    wangxinarhat 评论0 收藏0
  • 浏览器的进程与线程详解

    摘要:浏览器的渲染进程浏览器内核,是多线程的,主要以下几大类线程引擎线程事件触发线程定时器线程网络请求线程线程负责渲染浏览器界面元素当界面需要重绘或由于某种操作引发回流时该线程就会执行。 进程 进程是cpu的资源分配的最小单位。 多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如你可以听歌的同时,打开编辑器敲代码,编...

    zhjx922 评论0 收藏0
  • 浏览器的进程与线程详解

    摘要:浏览器的渲染进程浏览器内核,是多线程的,主要以下几大类线程引擎线程事件触发线程定时器线程网络请求线程线程负责渲染浏览器界面元素当界面需要重绘或由于某种操作引发回流时该线程就会执行。 进程 进程是cpu的资源分配的最小单位。 多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如你可以听歌的同时,打开编辑器敲代码,编...

    darryrzhong 评论0 收藏0
  • JavaScript线程机制与事件机制

    摘要:的单线程,与它的用途有关。为了利用多核的计算能力,提出标准,允许脚本创建多个线程,但是子线程完全受主线程控制,且不得操作。 showImg(https://segmentfault.com/img/remote/1460000016649971?w=1481&h=876); 一、进程与线程 1.进程 进程是指程序的一次执行,它占有一片独有的内存空间,可以通过windows任务管理器查看...

    godlong_X 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<