精华内容
下载资源
问答
  • 浏览器渲染进程(浏览器内核,每个Tab页面一个进程,是多线程浏览器渲染进程的GUI渲染线程,最后将渲染树绘制到页面上,然后浏览器会将各层的信息发送给GPU进程,GPU会将各层合成,显示在屏幕上。 普通图层和...

    浏览器多进程

    浏览器包含的进程:

    • Browser主进程
    • 第三方插件进程
    • GPU进程
    • 浏览器渲染进程(浏览器内核,每个Tab页面一个进程,是多线程)

    浏览器渲染进程的GUI渲染线程,最后将渲染树绘制到页面上,然后浏览器会将各层的信息发送给GPU进程,GPU会将各层合成,显示在屏幕上。

    普通图层和复合图层:
    浏览器渲染的图层一般包含普通图层以及复合图层。GPU中,各个复合图层单独绘制,互不影响。 
    普通文档流可以理解为一个复合图层(默认复合层),absolute布局等虽然可以脱离普通文档流,但它仍然属于默认复合层;
    可以通过硬件加速的方式,声明一个新的复合图层,它会单独分配资源。新复合图层中的变化,不会影响默认复合层里的回流重绘。



    浏览器渲染进程(浏览器内核)

    包含:

    • GUI渲染线程
    • JS引擎线程
    • 事件触发线程
    • 定时器触发线程
    • 异步http请求线程

    GUI渲染线程

    负责渲染浏览器界面,重排重绘。

    GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新则会被保存在一个队列中等到JS引擎线程空闲时立即被执行。

    渲染完毕后会触发load事件:
    DOMContentLoaded(仅当DOM加载完成,不包括样式表,图片) -> load(页面上所有的DOM,样式表,脚本,图片都已加载完成)

    css是由单独的下载线程异步下载的,css加载不会阻塞DOM树解析(异步加载时DOM照常构建)
    但会阻塞render树渲染(渲染时需等css加载完毕,因为render树需要css信息)

    渲染引擎的分层和合成机制

    当滚动页面或者手势缩放页面时,屏幕上就会产生动画的效果。是因为在滚动或者缩放操作时,渲染引擎会通过渲染流水线生成新的图片(帧率=渲染流水线每秒更新的帧数),并发送到显卡的后缓冲区。然后系统会让后缓冲区和前缓冲区互换,保证显示器在前缓冲区中读取到最新的图像(刷新率)。

    渲染引擎是如何生成一帧图像:有重排、重绘合成三种方式

    合成操作不需要触发布局和绘制两个阶段,比重排和重绘效率高。Chrome 中的合成技术包括分层分块合成。

    1、分层和合成机制

    生成布局树之后,渲染引擎会根据布局树的特点将其转换为层树(Layer Tree),层树中的每个节点都对应着一个图层,下一步的绘制阶段就依赖于层树中的节点。

    绘制出每一个图层的图片后,合成线程将这些图片合成为“一张”图片,并最终将生成的图片发送到后缓冲区。这就是一个大致的分层、合成流程。

    (在合成线程中实现的是整个图层的几何变换,透明度变换,阴影等,不会影响到图层的内容。)

    合成操作是在合成线程上完成的,不会影响到主线程执行。

    2、分块

    显示一个页面时,如果等待所有的图层都生成完毕,再进行合成的话,会耗费更长时间。因此,合成线程会将每个图层分割为大小固定的图块,然后优先绘制靠近视口的图块,可以加快页面的显示速度。

    将图层从计算机内存上传到 GPU 内存的操作会比较慢,Chrome又采取了一个策略:在首次合成图块的时候使用一个低分辨率的图片。

      在首次显示页面内容的时候,将这个低分辨率的图片显示出来,然后合成器继续绘制正常比例网页内容;当正常比例的网页内容绘制完成后,再替换掉当前显示的低分辨率内容。这种方式尽管会让用户在开始时看到的是低分辨率的内容,但是也比什么都看不到要好。

    代码优化:

    使用 will-change 属性来告诉渲染引擎会对某个元素做一些特效变换,渲染引擎会将该元素单独实现一层。当变换发生时,渲染引擎会通过合成线程直接去处理变换,就没有涉及到主线程。这样就提升了渲染的效率,这也是 CSS 动画比 JavaScript 动画高效的原因。

    (使用js改变transform也能享受这个属性带来的优化。既然css动画和js动画都能享受这个优化,那就不能说明css动画比js动画效率高)

    但当渲染引擎为一个元素准备一个独立层,它占用的内存也会大大增加,因为从层树开始,后续每个阶段都会多一个层结构,这些都需要额外的内存,所以要恰当地使用 will-change。

    JS引擎线程 、事件触发线程...

    JS引擎是单线程的,而且JS执行时间过长会阻塞页面,所以HTML5中支持了Web Worker。

    Web Worker:  (WebWorker与SharedWorker)

           为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。主线程与 Worker 线程的运行互不干扰,有利于 Worker 线程随时响应主线程的通信。等到 Worker 线程完成计算任务,再把结果返回给主线程。

    JS引擎线程与worker线程间通过特定的方式通信(postMessage API,需要通过序列化对象来与线程交互特定的数据)

    特点:

    Worker 线程运行的脚本文件,必须与主线程的脚本文件同源;

    Worker 线程无法读取主线程所在网页的 DOM 对象,也无法使用documentwindowparent这些对象,但是可以navigator对象和location对象。

    优缺点:Worker 线程可以负担一些计算密集型或高延迟的任务,主线程(通常负责 UI 交互)就不会被阻塞或拖慢。但是,Worker 比较耗费资源,不应该过度使用,一旦使用完毕就应该关闭。

    • WebWorker只属于某个页面,每一个render进程(Tab页)创建一个新线程来运行Worker中的JavaScript程序。
    • SharedWorker是浏览器所有页面共享的,Chrome浏览器为SharedWorker单独创建一个进程来运行JavaScript程序。

    事件触发、定时器触发、异步http请求线程的回调任务会添加到任务队列中,等待JS引擎的处理。

    (事件循环)
    JS引擎线程是主线程,形成一个执行栈,执行同步任务;
    事件触发线程管理一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。
    当使用setTimeout或setInterval时,需要定时器线程计时,计时完成后就会将特定的事件(回调函数)推入任务队列中。

    在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)
    macrotask:主代码块script、setTimeout\setInterval等(事件队列中的每个事件都是macrotask)
    microtask:Promise.then、process.nextTick等(node下process.nextTick的优先级高于Promise)

    Promise的官方版本与polyfill的区别:官方版本中是标准的microtask形式;polyfill一般都是通过setTimeout模拟的,所以是macrotask形式)

    总结运行机制:

    • 执行一个宏任务(执行栈中没有就从任务队列中获取)
    • 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
    • 宏任务执行完毕后,立即依次执行当前微任务队列中的所有微任务
    • 当前宏任务执行完毕后检查渲染,然后GUI线程接管渲染
    • 渲染完毕后,JS线程继续接管执行下一个宏任务(从任务队列中获取)

    展开全文
  • 你知道什么是多线程的ftp上传工具吗?多线程的ftp上传工具你见过吗?反正我是很少看见的,因为太少了,找到一款合适的多线程ftp上传工具是很难的。小编今天整理了五款多线程ftp上传工具。 第一款:服务器管理工具 它...

    你知道什么是多线程的ftp上传工具吗?多线程的ftp上传工具你见过吗?反正我是很少看见的,因为太少了,找到一款合适的多线程ftp上传工具是很难的。小编今天整理了五款多线程ftp上传工具。

    第一款:服务器管理工具

    它可以批量管理ftp站点,不过这都是基本功能,它最重要的是能定时上传下载、定时备份还能够自动更新。这些功能就是我推荐最主要的原因。可能说没有那么清楚的表达出来它的便捷,但只要你用了,那就一定无法逃脱它的魔掌。

    这款工具的颜色搭配的也挺好看的,绿白相间。界面清晰明了。服务器批量管理工具好处:批量管理、同步操作、到期提醒、数据安全和定期执行。适用系统:Windows和liunx操作系统。支持Vnc和Ftp批量操作。相信我准没错,这绝对是一款让你爱不释手的免费ftp工具。当然这工具也是纯绿色版的,官网上面都写了,感兴趣的可以自己去看看。

    下载地址:IIS7服务器管理工具
    在这里插入图片描述

    第二款:WinSCP

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。.winscp也可以链接其他系统,比如linux系统。WinSCP是一款Windows环境下使用的基于SSH的开源文件上传客户端,同时支持SFTP、SCP、FTP协议,你可非常方便地使用拖拽操作,同时也支持批处理脚本及命令行方式操作,WinSCP还内置了文本编辑器,方便你进行文本编辑,对于那些熟悉NC的人来讲用这种操作界面w会更为快速,抛开鼠标操作用传统键盘操作同样可以键指如飞。
    在这里插入图片描述

    第三款: FireFTP

    这是一个火狐的插件,必须在火狐Mozilla Firefox浏览器上面才能使用。FireFTP是出品 LiteServe/LiteWeb/LiteFTP 等工具的公司新出的又一个简单小巧且容易上手的 FTP 客户端工具,支持多线程文件传输。
    对FireFTP的工具是一个非常容易使用和更舒适的比很多其他FTP客户端你会发现周围。 Firefox转换成一个更全功能的FTP客户端。 您将欣赏消防的FTP一旦你习惯了。 这是非常有益的。同步:导航时保持目录同步;它是免费的!跨平台:适用于Windows,Mac OS X,Linux;国际:有20多种语言版本;安全:SSL / TLS / SFTP支持,与网上银行和购物相同的加密。
    在这里插入图片描述

    第四款:LeapFtp

    这是一款轻巧、灵活、功能强大的FTP客户端软件,用户界面友好,传输速度稳定,能够连接绝大部分FTP站点(包括一些教育站点),自带了许多免费的FTP站点,资源丰富,支持断点续传和远程目录搜索,可以自定义命令、远程监控传输,对于FTP连接来说,也是一个非常不错的软件。
    在这里插入图片描述

    第五款:CuteFTP

    这也是一款轻巧、功能强大的FTP客户端软件,通过构建构建于SSL或SSH2安全认证的客户端/服务器进行文件传输,支持FTP、SFTP、HTTP、HTTPS等多种传输协议,除此之外,还支持目录同步、智能覆盖、自动排程、多站点连接等高级功能,也是一个非常不错的FTP客户端软件。
    在这里插入图片描述

    展开全文
  • 我有一个页面有上传文件功能,并且还有一个倒计时功能,即点击上传文件开始,会从300秒开始倒数。 ...所以我想问一下,这个浏览器是否为单线程,在上传文件的同时 setinterval的代码就不会执行了?
  • Day13 多线程 3).多线程的好处: 提高程序的运行效率,提高用户的体验度。 线程不会因为等待某个资源而进入等待状态 创建新的线程: * 定义类继承Thread * 重写方法run * 创建Thread子类的对象 * 调用...

    Day13 多线程

    3).多线程的好处:

    提高程序的运行效率,提高用户的体验度。 线程不会因为等待某个资源而进入等待状态

     

     

     

     

    创建新的线程:

     *    定义类继承Thread

     *    重写方法run

     *    创建Thread子类的对象

     *    调用子类对象的方法 start()

     *    

     *  为什么继承Thread

     *    Thread类是线程对象类

     *    继承了Thread,子类也是线程对象

     *  

     *  为什么重写run

     *    Sun工程师,不清楚其他人员用线程做什么

     *    全部写在run

     *  

     *  为什么调用start

     *    线程: JVM利用Windows中的功能实现

     *    start() 调用 本地方法,开启的线程

     

     

     2.Thread类的方法,可以获取到线程名字

     *    String getName()

     *    

     *  Thread类方法 setName(String name)

     *  设置线程名字

     *  

     *  获取主线程名

     *    Thread,定义静态方法

     *    static Thread currentThread() 返回当前线程

     *    什么是当前线程: 现在运行的线程

     

     

    第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。

    第一种方式继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。

    实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

     

    3.创建线程程序第二个方式,接口方式

     *  java.lang.Runnable

     *    定义类实现接口Runnable

     *    重写抽象方法run

     *    创建Thread类对象,Thread(Runnable r)

     *    调用Thread对象start()方法

     

    4. 售票代码,单独定义方法

     *  pay方法,所有的代码,全是线程操作的共享数据

     *  同步整个方法,方法的定义修饰符,加同步

     *  

     *  同步方法有锁吗,同步方法的锁就是this对象

     *  

     *  静态同步方法有锁吗

     *    静态方法的对象锁可不是this

     *    锁是 本类.class对象

     *    Ticket.class

     

     

    当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程安全问题的产生。

     

     

    6.其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,CPU的使用率更高。

     

     

    7.思考:线程对象调用 run方法和调用start方法区别?

    线程对象调用run方法不开启线程,仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。

     

    2:请描述在什么样的情况下会出现线程安全的问题。

    线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态

    变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程

    同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

     

    6.java中提供了线程同步机制,它能够解决上述的线程安全问题,请分别写出他们的格式

    3.1同步代码块: 在代码块声明上 加上synchronized

    synchronized (锁对象) {

    可能会产生线程安全问题的代码

    }

    3.2同步方法:在方法声明上加上synchronized

    public synchronized void method(){

           可能会产生线程安全问题的代码

    }

     

    3.请描述线程的几个状态。

    线程包含以下几个状态:

    1. 新建状态:

       调用构造方法创建线程对象后,线程就会处于新建状态。  

    2.就绪状态:

       一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()

       方法。在调用start()方法后,运行run()方法之前,线程就会处于就绪状态。

    3.运行状态:

      当线程获得CPU的资源后,才会进入运行状态,调用run方法。

    4.阻塞状态:

      当正在运行的线程还没有运行结束,暂时让出CPU资源,让其它处于就绪

      状态的线程获得CPU资源。

    5.死亡状态:

      当线程的run方法运行结束后,线程就结束了,此时线程就会死亡状态。

     

    1. 7.多线程并发和多线程并行是什么呢?

    答:两个或者多个任务发送请求时,CPU只能执行一个,就会安排这些任务交替执行,由于CPU做着高速的切换,间隔的时间比较短,我们看起来像同时执行的,这就是多线程并发。

    并行是两个或多个任务同时执行,前提是多核CPU

    1. 8.同步代码块和同步方法的锁是谁?

    ;同步代码块的锁可以是任意类型的对象;非静态同步方法的锁是this;静态方法的锁是该类的字节码文件。

    1. 3.sleep和wait的区别?

    答:(1sleep是让线程睡眠,必须给相应的睡眠时间,不需要唤醒,时间到了会自动醒来,休眠时不放弃Cpu的执行权。(悲观锁机制)

    2wait的是让线程等待,可以传参也可以不传参,传参是在指定的时间后等待,需要被唤醒。等待的时候放弃cpu的执行权。(乐观锁机制)

    1. 什么情况下需要同步?

    :当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.

    如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.

     

    1. 开启线程:开一个新的方法栈区
    2. 运行是方法run(
    3. 只要开启一个线程:
    4. 出现一个新的方法栈,运行

    当调用一个线程对象start()方法后,此线程对象中的run()方法会被立即执行.(错误的)

    Start()方法之后进入到”就绪状态”,等待操作系统分配cpu时间(正确的)

    当一个线程对象的sleep()时间到了,会立即恢复运行(错误的)

    sleep()醒来后,会进入到”就绪状态”,等待操作系统分配cpu时间(正确的)

    Day14 网络编程

     

    InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,下表中列出了InetAddress类的一些常用方法。

     

     

     TCP协议分哪几个层

    链路层:链路层用于定义物理传输通道通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

    网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。

    运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。

    应用层:主要负责应用程序的协议,例如HTTP协议FTP协议等。

    C/S 软件和服务器容易出现更新问题 , 一个更新全部需要更新,

     

    B/S 网页和服务器 维护方便,客户端一个浏览器可以打开多个功能 弊端 所有浏览器内容存到浏览器  

    ip地址  它是由4个字节大小的二进制数来表示

     

     HTTPFTPUDPTCP

     我们涉及到的:

     1.UDP协议:

    1.数据要打包发送;

    2.数据大小有限制:64K

    3.不论是否有接收端,都可以发送。也称为:无状态的,不安全的协议。

      应用:视频广播,共享屏幕

     2.TCP协议:

    1.数据不需要打包,使用""的方式发送和接收;

    2.数据大小无限制;

    3.发送时,必须要有接收端;

     

    1.InetAddress类表示一个IP地址;

    2.InetAddress类没有构造方法,通过静态方法获取InetAddress对象;

    3.常用方法:

    静态方法:public static InetAddress getByName(String 计算机名/IP地址) :

    普通方法:public String getHostAddress():获取本机IP

     

    2.区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据

    TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

    JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端

    通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。

     

     

     

    public class TCPServer {

    public static void main(String[] args) throws IOException {

    //1,创建服务器,等待客户端连接

    ServerSocket serverSocket = new ServerSocket(8888);

    Socket clientSocket = serverSocket.accept();

    //显示哪个客户端Socket连接上了服务器

    InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址对象

    String ip = ipObject.getHostAddress(); //得到IP地址字符串

    System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);

     

    //7,获取Socket的输入流

    InputStream in = clientSocket.getInputStream();

    //8,创建目的地的字节输出流   D:\\upload\\192.168.74.58(1).jpg

    BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("D:\\upload\\192.168.74.58(1).jpg"));

    //9,Socket输入流中的数据,写入目的地的字节输出流中

    byte[] buffer = new byte[1024];

    int len = -1;

    while((len = in.read(buffer)) != -1){

    //写入目的地的字节输出流中

    fileOut.write(buffer, 0, len);

    }

     

    //-----------------反馈信息---------------------

    //10,获取Socket的输出流, 作用:写反馈信息给客户端

    OutputStream out = clientSocket.getOutputStream();

    //11,写反馈信息给客户端

    out.write("图片上传成功".getBytes());

     

    out.close();

    fileOut.close();

    in.close();

    clientSocket.close();

    //serverSocket.close();

    }

    }

     

    public class TCPClient {

    public static void main(String[] args) throws IOException {

    //2,创建客户端Socket,连接服务器

    Socket socket = new Socket("192.168.74.58", 8888);

    //3,获取Socket流中的输出流,功能:用来把数据写到服务器

    OutputStream out = socket.getOutputStream();

    //4,创建字节输入流,功能:用来读取数据源(图片)的字节

    BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("D:\\NoDir\\test.jpg"));

    //5,把图片数据写到Socket的输出流中(把数据传给服务器)

    byte[] buffer = new byte[1024];

    int len = -1;

    while ((len = fileIn.read(buffer)) != -1){

    //把数据写到Socket的输出流中

    out.write(buffer, 0, len);

    }

    //6,客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器端  (socket流不能判断读到-1 结束读操作 )

    socket.shutdownOutput();

     

    //-----------------反馈信息---------------------

    //12,获取Socket的输入流  作用: 读反馈信息

    InputStream in = socket.getInputStream();

    //13,读反馈信息

    byte[] info = new byte[1024];

    //把反馈信息存储到info数组中,并记录字节个数

    int length = in.read(info);

    //显示反馈结果

    System.out.println( new String(info, 0, length) );

     

    //关闭流

    in.close();

    fileIn.close();

    out.close();

    socket.close();

    }

    1.1 文件上传案例多线程版本

     

     

     

     

    实现服务器端可以同时接收多个客户端上传的文件。

    l 我们要修改服务器端代码

    /*

     * 文件上传多线程版本, 服务器端

     */

    public class TCPServer {

    public static void main(String[] args) throws IOException {

    //1,创建服务器,等待客户端连接

    ServerSocket serverSocket = new ServerSocket(6666);

     

    //实现多个客户端连接服务器的操作

    while(true){

    final Socket clientSocket = serverSocket.accept();

    //启动线程,完成与当前客户端的数据交互过程

    new Thread(){

    public void run() {

    try{

    //显示哪个客户端Socket连接上了服务器

    InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址对象

    String ip = ipObject.getHostAddress(); //得到IP地址字符串

    System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);

     

    //7,获取Socket的输入流

    InputStream in = clientSocket.getInputStream();

    //8,创建目的地的字节输出流   D:\\upload\\192.168.74.58(1).jpg

    BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("D:\\upload\\"+ip+"("+System.currentTimeMillis()+").jpg"));

    //9,Socket输入流中的数据,写入目的地的字节输出流中

    byte[] buffer = new byte[1024];

    int len = -1;

    while((len = in.read(buffer)) != -1){

    //写入目的地的字节输出流中

    fileOut.write(buffer, 0, len);

    }

     

    //-----------------反馈信息---------------------

    //10,获取Socket的输出流, 作用:写反馈信息给客户端

    OutputStream out = clientSocket.getOutputStream();

    //11,写反馈信息给客户端

    out.write("图片上传成功".getBytes());

     

    客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器端

    out.close();

    fileOut.close();

    in.close();

    clientSocket.close();

    } catch(IOException e){

    e.printStackTrace();

    }

    };

    }.start();

    }

     

    //serverSocket.close();

     

    转载于:https://www.cnblogs.com/shan1393/p/8945093.html

    展开全文
  • 2.setInterval和setTimeout本质上并不是多线程 三、Web Worker支持多线程 1.多线程间数据交互 2.Web Worker的兼容性 3.Web Worker的使用限制 3.1同源限制 3.2访问限制 总结 一、浏览器的线程和进程 1....

    目录

     

    一、浏览器的线程和进程

    1.浏览器的线程

    2.浏览器是多进程的

    二、Javascript是单线程的

    1.异步Ajax也是单线程的

    2.setInterval和setTimeout本质上并不是多线程

    三、Web Worker支持多线程

    1.多线程间数据交互

    2.Web Worker的兼容性

    3.Web Worker的使用限制

    3.1同源限制

    3.2访问限制

    4.Web Worker的应用场景

    总结


     

    一、浏览器的线程和进程

    1.浏览器的线程

    一个浏览器通常由以下几个线程:

     

    • 渲染引擎线程:负责页面的渲染
    • JS引擎线程:负责JS的解析和执行
    • 定时触发器线程:处理定时事件,比如setTimeout,setInterval
    • 事件触发线程:处理DOM事件
    • 异步http请求线程:处理http请求

    浏览器中有三个常驻的线程,分别是JS引擎线程、界面渲染线程、事件触发线程。

    需要注意的是,渲染线程和JS引擎线程是不能同时进行的。渲染线程在执行任务的时候,JS引擎线程会被挂起。因为JS可以操作DOM,若在渲染中JS处理了DOM,浏览器可能就混乱了。

    2.浏览器是多进程的

    Google或IE浏览器每打开一个tab标签页就会有一个子进程,具体可打开任务管理器查看。

     

    二、Javascript是单线程的

    浏览器端JavaScript是以单线程的方式执行的,也就是说JavaScript和UI渲染占用同一个主线程,那就意味着,如果JavaScript进行高负载的数据处理,UI渲染就很有可能被阻断,浏览器就会出现卡顿,降低了用户体验。

    1.异步Ajax也是单线程的

    Ajax是单线程的,因为JavaScript是单线程的,Ajax属于JavaScript范畴,因此Ajax是单线程的。

    Ajax请求确实是异步的,JS引擎执行异步代码而不用等待,是因为有消息队列事件循环,这请求是由浏览器新开一个线程请求。浏览器中很多行为是异步的,当一个异步事件发生的时候,它就进入事件队列,浏览器有一个内部的消息循环,Event Loop(事件循环),会轮询大的事件队列并处理事件,只有前面的处理完毕了,空闲了才会执行这个事件,而JavaScript引擎始终是单线程运行回调函数。

    2.setInterval和setTimeout本质上并不是多线程

    1.setTimeout,setInterval并不是多线程,只是一个定时的事件触发器,它们在合适的时间把一些JS代码塞到JS引擎的队列中。

    2.setTimeout(aFunction, 0),这行代码看似的意思是在0秒之后执行aFunction, 但这并不意味着立即执行。其它真正的意思是立刻把aFunction的代码放到当前JS引擎的队列中。所以当前代码块执行完成之前,aFunction的代码是得不到执行的。

    3.在一个事件的响应代码执行完成之后,即使队列中有待执行的代码,浏览器也会先执行页面渲染和响应事件,完成之后再执行队列中的代码。

     

    三、Web Worker支持多线程

    web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。

    1.多线程间数据交互

    Web Worker线程和原本的JS线程互不影响.

    两个线程之间是通过onPostMessage 和 onMessage这两个函数来进行通讯的。其中onPostMessage(data)的参数是你要传递的数据,而onMessage是一个回调函数,只有在接受到数据时,onMessage会被回调,onMessage有一个隐藏的参数,那就是event,我们可以用event.data获取到传递过来的数据来更新主线程。

    2.Web Worker的兼容性

    3.Web Worker的使用限制

    3.1同源限制

    分配给Worker 线程运行的脚本文件(worker.js),必须与主线程的脚本文件(main.js)同源。

    3.2访问限制

    Worker子线程所在的全局对象,与主线程不在同一个上下文环境,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象,global对象的指向有变更,window需要改写成self,不能执行alert()方法和confirm()等方法,只能读取部分navigator对象内的数据。另外chrome的console.log()倒是可以使用,也支持debugger断点,增加调试的便利性。

    4.Web Worker的应用场景

    1、使用专用线程进行数学运算
    Web Worke设计的初衷就是用来做计算耗时任务,大数据的处理,而这种计算放在worker中并不会中断前台用户的操作,避免代码卡顿带来不必要的用户体验。例如处理ajax返回的大批量数据,读取用户上传文件,计算MD5,更改canvas的位图的过滤,分析视频和声频文件等。worker中除了缺失了DOM和BOM操作能力以外,还是拥有非常强大的js逻辑运算处理的能力的,相当于nodejs一个级别的的运行环境。

    2、高频的用户交互
    高频的用户交互适用于根据用户的输入习惯、历史记录以及缓存等信息来协助用户完成输入的纠错、校正功能等类似场景,用户频繁输入的响应处理同样可以考虑放在web worker中执行。例如,我们可以 做一个像Word一样的应用:当用户打字时后台在词典中进行查找,帮助用户自动纠错等等。

    3、数据的预取
    对于一些有大量数据的前后台交互产品,可以新开一个线程专门用来进行数据的预取和缓冲数据,本地web数据库的行写入和更改,长时间持续的运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断,也有利于随时响应主线程的通信。也可以配合XMLHttpRequest和websocket进行不断开的通信,实现守卫进程。

    最后,web worker有了多线程的形(有了多线程的用法),但还不具备多线程的神(不具备线程通信、锁等后台线程的基本特性),web worker的本质是支持我们把数据刷新与页面渲染两个动作拆开执行(不使用web worker的话这两个动作在主线程中是线性执行的)。


    总结

    1.Javascript是单线程的。

    2.JS的异步Ajax和setInterval/setTimeout函数本质上也是单线程的。

    3.Web Worker才是真正的多线程。但是使用上会有一些限制,如无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。

    展开全文
  • 众所皆知,web上传大文件,一直是一个痛。...续传要求:在刷新浏览器后能够续传上传,在重启浏览器后能够继续上传上(关闭浏览器后重新打开),在重启电脑后能够继续上传。 支持PC端全平台,Windows,Mac,Linux 浏览
  • 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验; 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。 支持...
  • .NET多线程上传文件

    2018-06-17 22:57:00
    为了提高上传速度用了多线程,用多线程和常规上传做了一下简单对比。 前端代码 <input type="file" id="files" multiple /><br /> 上传 <div id="res"></div> $('#btnUpload').click(function () { var ...
  • 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能够上传...
  • 支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到50个G。 支持自动加载本地文件,要求能够自动加载指定的本地文件。 支持文件批量下载,要求不要
  • 用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器...
  • 多线程断点下载

    2016-11-29 23:03:16
    做服务端开发或者web开发的同学,相比于安卓、IOS开发的同学,对于这个概念会比较陌生,因为web只能使用浏览器上传和下载,可编程性不高,客户端具体的上传和下载过程是个黑盒,比如下载过程到底是不是多线程,...
  • 多线程

    2017-07-29 17:53:25
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit...图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
  • data 提供input type=”file”类的上传输入域 大致实现原理:当enctype的值是multipart/form-data时,浏览器会把每个表单项进行分割,分割成不同的部件,以boundary的值为分割标识,这个标识的字符串是随机生成的,...
  • android多线程下载

    2016-02-01 15:22:33
    httpclient的get和post、提交数据的中文乱码处理、文件上传、文件下载、多线程下载原理、android多线程下载 出现下载进度条、android多线程断点下载、开源项目多线程断点下载(Afinal框架)
  • Python多线程

    万次阅读 2020-05-28 19:47:47
    Python多线程浏览 1、开发环境 Python版本 需要手动安装的库 2、源代码 3、使用方法 重要!!!使用前必看 后续会上传可执行文件(.exe)以便没有安装开发环境的小伙伴使用。 1、开发环境 Python版本 使用Python3.8...
  • 多线程 多进程 区别

    2018-08-15 23:26:14
     通信方法 : 线程共用进程空间,所以进程的全局变 量对进程内线程均可见。线程往往使用全局 变量进行通信  注意事项 : 线程间使用全局变量进行通信,全局变量为 共享资源,往往需要同步互斥机制 线程的同步...
  • JavaScript多线程编程

    2019-03-05 14:21:45
    远离浏览器卡顿,提高用户体验,提升代码运行效率,使用多线程编程方法。 浏览器端JavaScript是以单线程的方式执行的,也就是说JavaScript和UI渲染占用同一个主线程,那就意味着,如果JavaScript进行高负载的数据...
  • 一、浏览器的多进程概括 要想搞明白什么是浏览器的多进程,首先得知道什么是进程。按照维基百科的说法: 进程是计算机中已运行程序的实体。...那什么又是单线程和多线程呢,我们来看一小段代码: v...
  • 多线程技术

    2018-12-10 10:21:04
    多线程技术 2016年11月07日 15:29:41 思维逆逝 阅读数:1884 &lt;span class="tags-box artic-tag-box"&gt; &lt;...
  • 常识:从百度百科上面我们知道,SharedPreferences是不支持多线程的,但是这次我使用sp成功的实现了多线程断点下载。 服务器: 使用的是tomcat服务器,在C:\apache-tomcat-7.0.59\webapps\ROOT目录下存放pp.zip文件...
  • 编程资料 -C# 多线程

    千次阅读 2011-04-19 22:57:00
    编程资料 - 多线程 C#多线程编程实例实战 作者: ...本文通过对常见的单个写入/多个阅读程序的分析来探索c# 的多线程编程。 问题的提出 所谓单个写入程序/多个阅读程序的线程同步问
  • 多线程在web中的使用

    千次阅读 2018-09-28 15:01:05
    整理网络上的 最典型的如: ... 且这类任务即使失败也不是特别重要的。 2、后台线程:比如定期...最典型的应用比如tomcat,tomcat内部采用的就是多线程。 上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理...
  • 编程资料 -C# 多线程

    万次阅读 2009-11-12 17:08:00
    编程资料 - 多线程C#多线程编程实例实战作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读...本文通过对常见的单个写入/多个阅读程序的分析来探索c#的多线程编程。问题的提出所谓单个写入程序/多个阅读
  • 使用多线程需要使用队列保证数据安全 因为队列被多线程执行一次就少一个值,队列中有13个url链接 当线程拿一个链接就少一个链接 直到拿完为止,如果大家使用的是列表 那么数据将会重复爬取。 二、课程亮点 多线
  • 浏览器上传大文件

    2019-08-16 10:56:53
    用JAVA实现大文件上传及显示进度信息 ... ... 一.大文件上传基础描述: ... 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对HttpMultiPart协议内容进行解析,并供开发人员调用请求的表单内容。...
  • 下载工具我想没有几个人不会用的吧,前段时间比较无聊,花了点时间用java写了个简单的http多线程下载程序,纯粹是无聊才写的,只实现了几个简单的功能,而且也没写界面,今天正好也是一个无聊日,就拿来写篇文章,...
  • google浏览器最新版

    2009-12-23 20:49:30
    官网版的浏览器,支持多线程官网版的浏览器,支持多线程官网版的浏览器,支持多线程官网版的浏览器,支持多线程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,702
精华内容 16,280
关键字:

多线程上传浏览器