在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎。

首先来看一下大家用的浏览器都具有那些线程吧。

假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让用户进行等待,在等待的过程中,整个js线程会被阻塞,后面的代码不能正常运行,这可能大大的降低用户体验,这时候我们就期望拥有一个工作线程来处理这些耗时的操作。在传统的html时代是基本不可能实现的,而现在,我们拥有一种叫做worker的东西。它是js里的一个类,而我们只需要创建它的实例就可以使用它。

var worker = new Worker(js file path);

构造函数的参数填上你的js文件的路径,这个js文件将会在浏览器新开的线程里运行,而与原先的js引擎的线程并不影响。

下面看个例子。

start

stop

alert

var ipt = document.getElementById("ipt");

var stop = document.getElementById("stop");

var start = document.getElementById("start");

var ale = document.getElementById("ale");

var worker = new Worker("js/test22.js");

worker.onmessage = function(){

ipt.value = event.data;

};

stop.addEventListener("click",function(){

//用于关闭worker线程

worker.terminate();

});

start.addEventListener("click",function(){

//开起worker线程

worker = new Worker("js/test22.js");

});

ale.addEventListener("click",function(){

alert("i'm a dialog");

});

下面是test22.js里的代码,也就是存在于worker线程里的代码

var i = 0;

function mainFunc(){

i++;

//把i发送到浏览器的js引擎线程里

postMessage(i);

}

var id = setInterval(mainFunc,1000);

运行起来我们会发现

点击确定后,它的数值并非2,而是一个比2更大的数

虽然dialog的弹出会阻塞js引擎线程,但是并不影响worker线程的运行,所以,在我们点击确定后,只是在js引擎线程上更新了新的内容,而数值是一直在跑动的,这就说明worker线程和原本的js线程互不影响.

那么既然互不影响,两个线程之间要怎么来联系呢,答案其实已经在代码里了,那就是onPostMessage 和 onmessage这两个函数,其中onPostMessage(data)的参数是你要传递的数据,而onmessage是一个回调函数,只有在接受到数据时,onmessage会被回调,onmessage有一个隐藏的参数,那就是event,我们可以用event.data获取到传递过来的数据来更新主线程。

使用worker线程应注意的是,所有js里集成的对象都在js线程里,而并非worker线程。

例如我们在worker线程里写上:

var a = document.getElementById("a");

结果你会得到一条Error,告诉你找不到document,或者document is undefined。所以我们尽量把需要的东西都写到主线程里,而只把耗时的操作写到worker线程里。

java 线程 js_js javascript 实现多线程相关推荐

  1. java 线程面试题_JAVA多线程面试题(一)

    1.进程和线程的区别 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进 ...

  2. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  3. java线程堆栈nid.tid_java多线程死锁 Java问题定位之Java线程堆栈分析(2)

    从上面的main线程看,线程堆栈里面的最直观的信息是当前线程的调用上下文,即从哪个函数调用到哪个函数(从下往上看),正执行到哪一类的哪一行,借助这些信息,我们就对当前系统正在做什么一目了然. 另外,从 ...

  4. java 线程同步condtion_Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信...

    [我们不仅可以使用synchronized来实现多线程同步,还可以通过创建锁对象来实现多线程的同步,还是上次模拟取现的操作,这次利用lock对象实现同步,下面是代码:    import 如果程序不使 ...

  5. java线程知识梳理_Java多线程——多线程相关知识的逻辑关系梳理

    1 学习多线程知识的根本目标 多线程知识的根本目标是:设计稳健的并发程序. 当然,本文无法回答这个实践性很强的问题(这与具体的业务相关,涉及到具体的策略),本文主要阐述相关知识之间的关系,希望初学者不 ...

  6. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

  7. java 线程 free_Java进阶05 多线程

    多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队 ...

  8. java线程下载文件_Java多线程下载文件实例详解

    本文实例为大家分享了Java多线程下载文件的具体代码,供大家参考,具体内容如下 import java.io.File; import java.io.InputStream; import java ...

  9. java 线程锁概念_Java多线程——锁概念与锁优化

    为了性能与使用的场景,Java实现锁的方式有非常多.而关于锁主要的实现包含synchronized关键字.AQS框架下的锁,其中的实现都离不开以下的策略. 悲观锁与乐观锁 乐观锁.乐观的想法,认为并发 ...

最新文章

  1. ES和JS的区别,以及JavaScript的基本组成
  2. tomcat结构分析
  3. Competition——互联网比赛(编程相关):国内外各种互联网比赛举办时间、条件、细节等详细攻略
  4. 创建provider服务
  5. 比特币一种点对点的电子现金系统是哪一年诞生的_驭凡学堂 中本聪创造比特币的原因是为了解决技术难题...
  6. docker search
  7. java正则表达式获得html字符串中图片的url地址
  8. java application.doevents_Application.DoEvents()笔记
  9. 台式机通过网线共享笔记本电脑无线网络
  10. windows“运行”自定义“命令”的实现
  11. java log4j详解_log4j详解
  12. 作业1:关于使用python中scikit-learn(sklearn)模块,实现鸢尾花(iris)相关数据操作(数据加载、标准化处理、构建聚类模型并训练、可视化、评价模型)
  13. 关于Rasa你必须要知道的几件事
  14. Unity 获取设备信息
  15. mybatis拦截器实现数据脱敏拦截器使用
  16. linux下查看文件内容的命令
  17. unity多个场景切换保存数据_Unity 场景间切换传递保存数据的方法
  18. 010101各个系统环境搭建
  19. C#.net串口通信详解!
  20. 三星wep200蓝牙耳机中文说明书

热门文章

  1. 数据分析软件工具有哪些?
  2. 手机android开不了机,安卓手机开不了机,手把手教你如何解决安卓智能手机开不了机问题...
  3. Linux环境下,通过shell脚本实现一键部署MySQL,并支持多种类型
  4. 为企业用户配置专有UPN后缀[为企业维护windows server 2008系列十三]
  5. 【HTML】做一个HTML的个人简介页面
  6. 有关远程连接后aero效果消失的问题
  7. 基于8051 单片机的 RFID读卡器
  8. StrongShop 开源商城 跨境电商独立站的理想选择
  9. 谷粒商城三阶段课件_备考2021年初级会计考试几大阶段你知道吗?
  10. 服务器io性能指标,性能测试中服务器关键性能指标浅析