您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 网站教程 > AJAX教程 >
    JavaScript可否多线程?
    时间:2016-07-14 20:58 来源: 作者: 浏览:收藏 挑错 推荐 打印
    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如    [javascript]
        setTimeout( function(){ alert(‘你好!'); } , 0);
        setInterval( callbackFunction , 100);
        setTimeout( function(){ alert(’你好!'); } , 0);
        setInterval( callbackFunction , 100);
        认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了.
        同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑!
        但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解:
        [javascript]
        div.onclick = function(){
        setTimeout( function(){document.getElementById('inputField').focus();}, 0);
        };
        div.onclick = function(){
        setTimeout( function(){document.getElementById('inputField').focus();}, 0);
        };
        既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇.
        直到最后某一天 , 你不小心写了一段糟糕的代码:
        [javascript]
        setTimeout( function(){ while(true){} } , 100);
        setTimeout( function(){ alert(‘你好!'); } , 200);
        setInterval( callbackFunction , 200);
        setTimeout( function(){ while(true){} } , 100);
        setTimeout( function(){ alert(’你好!'); } , 200);
        setInterval( callbackFunction , 200);
        第一行代码进入了死循环,但不久你就会发现,第二,第三行并不是预料中的事情,alert问候未见出现,callbacKFunction也杳无音讯!
        这时你彻底迷惘了,这种情景是难以接受的,因为改变长久以来既定的认知去接受新思想的过程是痛苦的,但情事实摆在眼前,对JavaScript真理的探求并不会因为痛苦而停止,下面让我们来展开JavaScript线程和定时器探索之旅!
        出现上面所有误区的最主要一个原因是:潜意识中认为,JavaScript引擎有多个线程在执行,JavaScript的定时器回调函数是异步执行的.
        而事实上的,JavaScript使用了障眼法,在多数时候骗过了我们的眼睛,这里背光得澄清一个事实:
        JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.
        JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.
        那么单线程的JavaScript引擎是怎么配合浏览器内核处理这些定时器和响应浏览器事件的呢?
        下面结合浏览器内核处理方式简单说明.
        浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以保持同步.假如某一浏览器内核的实现至少有三个常驻线程:javascript引擎 线程,界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程,如Http请求线程,这些异步线程都会产生不同的异步事件,下面通过一 个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调用原理都是大同小异.
        JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如
    JavaScript可否多线程?

    (责任编辑:12图资源库)