js多线程解释与运用

1,提出问题
            执行一个同步操作时,如果耗时非常长,导致主线程堵塞的问题
            问题的产生:由于用户界面和js进程公用一个线程,js高强度的计算会导致浏览器无暇
            顾忌用户界面,进入假死状态
        2,多线程
            通过使用 web worker,我们可以在浏览器的后台运行js,进而不占用浏览器自身线程
            web worker可以提高应用的总体性能,并且提高用户体验
            创建后台进程,这些进程不会卡死用户界面,更适合用来进行存数据与ui无关,比较小号cpu的计算
        3,web worker 兼容支持性
            if(window.Worker){
                alert('支持')
            }else{
                alert('不支持')
            }
            ie6789不支持
        4,web worker 工作原理

                  --向worker发送要处理的数据--

            页面                  worker进程
                <--worker将接收到的数据进行<--处理,并返回给页面
        5,web worker语法
            创建worker对象:
                var work = new Worker(url);
                参数url:处理该worker进程的js文件路径
                eg:
                    var ww = new Worker('js/count.js');
            页面向worker发送数据:
                ww.postMessage(msg);
                参数msg:向worker空间发的数据,最好为字符串,其他数据格式要注意兼容性
                eg:
                    ww.postMessage('hello word');
            页面接收worker返回的数据:
                message事件 worker返回数据时触发
                eg:
                    ww.adEventListener('message',function(e){
                        alert(e.data);//e.data就是worker返回的内容
                    },false);
            worker接收数据:
                    message事件 页面发送数据是触发
                    eg:
                        self.addEventListener('message',function(e){

                                e.data
                                //就是页面发送来的数据
                                //数据处理
                                //数据返回
                        },false)
            worker数据返回:
                postMessage(msg);
                参数msg:返回给页面处理过数据
        6,停止worker
            1)在页面中停止worker
                ww.terminate()
            2)在worker中停止worker
                    close();
        7,在worker内部可以在次开启worker
                importScript(url,url,...);
                eg:
                    importScript('worker1.js','worker2.js');
                    addEventListener('message',function(e){});
        8,web Worker 注意事项
            1)worker进程内,全局对象不是window,而是self
            2)不能使用DOM,但是可以访问定时器和ajax
            3)不同浏览器对跨域限制不同,最好不要跨域
            4)子线程webkit不兼容,不建议使用

猜你喜欢

转载自blog.csdn.net/qq_42043377/article/details/81435371