讲多线程之前,我们先了解一下JS的事件机制

浏览器运行时,脚本必须定期让位给UI进程进行来维持网页的响应,闲置太长时间的脚本可能会被浏览器当成失控脚本,进而造成假死或弹窗

事件触发的设计javascript中的非阻塞IO机制让到来的消息在其他操作完成前排序等待,js以这种方式来模拟并发,它利用闭包、回调或promise来减少较慢操作的影响。

   多线程: 

   举个例子:假如女朋友在洗澡,她洗澡需要30~60分钟,你不可能在卧室兴奋而焦急地等待这么长时间吧,总得找点事做吧,别TM兴奋过度,反而之后萎了,等她洗完,该干啥就干啥,其实多线线程,就是同一时刻,执行多个线程,并发处理任务

javascript本身的事件机制,决定了javascript是单线程来处理事务,但在实际应用中,往往需要使用多线程来计算一些复杂的逻辑,却不能影响页面的渲染及事件使用,这样,多线程处理,显得必不可少,那么现在介绍几种实现多线程的方式:

我们先看个例子

<script>
document.getElementById('test').onclick = function(){
alert(1);
} for(var i=0;i<100000;i++){
console.log(i);
}
</script> 浏览器直接卡死,或根本就没有反应,点击事件也用不了

What is the fuck?  这得多线程呀,咋弄?

1.  Concurrent.Thread.js 适用于老式浏览器

小日本是牛逼呀,这个插件就像女优一样优秀,总能给人惊喜、试一试的冲动。

          使用方式一:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id="test">测试</button>
<script src="Concurrent.Thread-full-20080319.js"></script>
<script>
document.getElementById('test').onclick = function(){
alert('出来啦');
}; function cala(){
for(var i=0;i<100000;i++){
console.log(i);
};
} Concurrent.Thread.create(cala);
</script>
</body>
</html>

咋样,舒畅吧,头发去无踪,头屑更出众

使用方式二:    

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id="test">测试</button>
<script src="Concurrent.Thread-full-20080319.js"></script>
<script type="text/x-script.multithreaded-js">
document.getElementById('test').onclick = function(){
alert('射出来');
}; for(var i=0;i<100000;i++){
console.log(i);
};
</script>
</body>
</html>

         2. Worker    适用于支持H5的浏览器

             不能在本地运行,需要在发布环境中执行

            

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id="test">测试</button>
<script>
document.getElementById('test').onclick = function(){
alert('射出来');
}; var worker; //检测浏览器是否支持Worker
if(typeof(Worker) !== undefined){
worker = new Worker("worker.js");
worker.addEventListener("message",function(e){
//关闭worker
worker.terminate();
},false);
}else{
div.innerHTML = "IE已死,请更换浏览器!";
} </script>
</body>
</html>

worker.js 文件

for(var i=0;i<=100000;i++){
console.log(i);
//通知主线程,已经计算完了
if(i==100000) postMessage(i); };

          

javascript多线程简介的更多相关文章

  1. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  2. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  3. JavaScript面向对象简介

    JavaScript面向对象简介 @(编程) [TOC] 1. 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是 ...

  4. iOS开发多线程篇—多线程简介

    iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...

  5. Javascript多线程引擎(十)---Web服务器

     Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...

  6. Javascript多线程引擎(九)

    Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...

  7. Javascript多线程引擎(八)

    Javascript多线程引擎(八)    Javascript 多线程项目, 做到现在已经快3个月了(加上前期准备编译原理和必要的文档), 该项目(js-engine)已经快进入尾声了, 现在该引擎 ...

  8. Javascript多线程引擎(七)

    Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...

  9. Javascript多线程引擎(六)

    Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...

随机推荐

  1. 分享php中四种webservice实现的简单架构方法及实例(转)

    本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的 HessianPHP,那么一下就简单的介绍下这几种webserv ...

  2. easyeclipse for php 如何默认显示行号

    呃... 相当简单 window->preferences->PHPeclipse web development->php 然后找到appearance选项卡 在 show lin ...

  3. 关于mybatis用mysql时,插入返回自增主键的问题

    公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...

  4. CSS 创建方式与优先级

    最近想学习自动化测试--web元素的匹配查找,一直搞不懂CSS的相关标签与对元素的渲染方式. 本文转自W3School: http://www.w3school.com.cn/css/css_howt ...

  5. hibernate 入门案例

    1,创建工程,导入jar ojdbc14.jar 数据库驱动包,我用的是oracle数据库,根据实际的数据库选择驱动包 创建java类,并利用bibernate插件完成orm映射,创建hbm.xml ...

  6. CF Polycarpus' Dice (数学)

    Polycarpus' Dice time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  7. CF A and B and Chess

    A and B and Chess time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. 核心概念 —— 服务容器

    1.简介 Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具.依赖注入听上去很花哨,其实质是通过构造函数或者某些情况下通过 set 方法将类依赖注入到类中. 让我们看一个简单的例子: ...

  9. C#算法基础之选择排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. SQL Server 2008下日志清理方法

    1.将数据库设置成 简单 模式 选择要收缩的数据库,点右键 属性->选项,选择 简单模式 2.选择任务->收缩->文件 3.选择日志