2:将鼠标悬停在页面图层上 了解非快速可滚动区域 由于JavaScript是运行在主线程上的,所以当合成页面时,合成器线程会标记页面的一个区域,该区域将事件处理程序附加为“非快速可滚动区域”。...通过获取此信息,合成器线程可以确保在该区域中发生事件时将输入事件发送到主线程。 如果输入事件来自该区域之外,则合成器线程在不等待主线程的情况下进行合成新帧。 ?...图3:输入到非快速可滚动区域的示意图 在编写事件处理程序时要注意 Web开发中常见的事件处理模式是事件委托。 由于事件冒泡,你可以在最顶层的元素上附加一个事件处理程序,并根据事件目标委派任务。...即使你的应用不关心页面中某些部分的输入,合成器线程也必须与主线程通信,并且在每次输入事件进入时都要等待它。因此合成器的平滑滚动能力被破坏了。 ?...启用功能策略可确保应用的某些行为并防止你出错。 例如,如果要确保应用永远不会阻止解析,或者可以在同步脚本策略上运行应用。
(关于主线程和长任务,我们在浏览器之性能指标-TTI有过介绍,这里就不在赘述) 当一个长任务正在处理时,浏览器无法简单地暂停它并响应用户的操作,比如用户的点击事件,而这些操作发生在长任务进行期间。...❞ 例如,如果主线程上的任务运行时间为60毫秒,则「长任务的阻塞时间」将等于10毫秒。 ❝TBT是「所有长任务」的主线程阻塞时间的总和。...进入Performance部分并点击重新加载按钮,等待工具分析我们的页面。 3. 仔细查看生成的报告中的Main(主线程)部分。...那些「右上角标价有红色小三角的灰色任务」就是长任务 将鼠标悬停在这些任务上,可以查看特定任务阻塞主线程的时间。所有这些长任务的时间总和将计算出我们的TBT得分。 5....减少主线程工作 减少主线程工作时,应缩短其在解析、编译和执行CSS和JavaScript文件上所花费的时间。
如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行) image.png 线程: 线程比进程相似,但线程是一个比进程更小的执行单位...总结:线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。...如何避免线程死锁?...new 一个 Thread ,线程进入了新建状态;调用 start() 方法,会启动一个线程并使线程进入就绪状态,当分配到时间片后就可以运行了。...start() 会执行线程 的响应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。
线程池的概念 本质就是一个能够容纳多个线程的容器,其中的线程可以反复利用,省去了频繁创建线程对象的操作,无需因为反复创建线程对象而消耗过多资源 工作线程(PoolWorker) 表示线程池中的线程,...在没有任务时处于等待状态,可以循环的执行任务 任务队列(TaskQueue) 用于存放没有处理的任务,提供一种缓冲机制 任务接口(Task) 每个任务必须实现的接口,一共工作线程调度任务的执行,它主要规定了任务的入口...,任务执行完后的收尾工作,任务的执行状态等等 线程池管理器(ThreadPool) 用于创建并管理线程。...通俗的讲就是任务来后就分配一个线程使用,线程处于占用状态,如果任务执行完毕,线程归还于线程池,并且暂处于空闲状态 合理利用线程池的好处 降低资源消耗 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用...); //第四次向线程池提交任务,超出线程池固定数量,此时线程池复用之前的线程 // pool.shutdown(); 在等待任务执行完毕之后关闭线程池
异步代码可以暂停并稍后恢复,尽管一次只执行一个程序。在程序中暂停和恢复代码可以让它继续在更新用户界面等短期操作上取得进展,同时继续处理长期运行的操作,如通过网络获取数据或解析文件。...Swift中的异步函数可以放弃它正在运行的线程,这允许另一个异步函数在第一个函数被阻止时在该线程上运行。 虽然可以在不使用Swift语言支持的情况下编写并发代码,但该代码往往更难阅读。...标记为await的代码中可能的暂停点表示,当前代码可能会在等待异步函数或方法返回时暂停执行。这也被称为生成线程,因为在幕后,Swift暂停在当前线程上执行代码,而是在该线程上运行一些其他代码。...以下是您如何思考这两种方法之间的差异: 当以下行上的代码取决于该函数的结果时,使用await调用异步函数。这创造了按顺序进行的工作。...任务和任务组 任务是可以作为程序的一部分异步运行的工作单元。所有异步代码都作为某些任务的一部分运行。上一节中描述的async``let语法为您创建一个子任务。
阻塞调用:比如 socket 的 recv(),调用这个函数的线程如果没有数据返回,它会一直阻塞着,也就是 recv() 后面的代码都不会执行了,程序就停在 recv() 这里等待,所以一般把 recv...A 有 X,等待 Y。 B 有 Y,等待 X。 于是A,B发生了循环等待,造成死锁。给用户的感觉就是程序卡着不动了。 在写代码的时候要特别注意共享资源的使用,用信号量控制好,避免造成死锁。...线程执行完就会被销毁,如果不想线程被频繁的创建,销毁,怎么办?可以给线程里面写个死循环,或者让线程有任务的时候执行,没任务的时候挂起,就像iOS中的 runloop 机制一样。...CPU调度策略 在并发运行中,CPU需要在多个程序之间来回切换,那么如何切换就有一些策略 3.1 先来先服务 - 时间片轮转调度 这个很简单,就是谁先来,就给谁分配时间片运行,缺点是有些紧急的任务要很久才能得到运行...3.4 最高响应比优先 用线程的等待时间除以服务时间,得到响应比,响应比小的优先运行。这样不会造成某些任务一直得不到响应。
线程和进程 功能 进程,能够完成多任务,比如在一台电脑上能够同时运行多个QQ。 线程,能够完成多任务,比如一个QQ中的多个聊天窗口。 定义的不同 进程是系统进行资源分配和调度的一个独立单位。...线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。...线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。...进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程不能够独立执行,必须依存在进程中。...可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人。 优缺点 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程则相反。
系统调度是操作系统重要功能,在嵌入式开发,也要了解系统调度的基本原理。对于嵌入式Linux开发,一般使用多线程和多进程开发,对于运行RTOS的嵌入式系统,一般使用多任务开发。...这些线程、进程、任务的调度,有许多相似之处。...1 进程的三种状态 执行态(Run):进程占用CPU资源,对于单核处理器,任一时刻只能有一个进行处于执行态 就绪态(Ready):进程本身具备运行条件,但由于处理机的个数少于可运行进行从个数,暂未运行...进程切换 进程切换是指,操作系统为了控制进程的执行,必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,也称为任务切换,或上下文切换。...AUTOSAR中定义的任务有两个类别: 基础任务:只有运行、阻塞、就绪三个状态。 扩展任务:在基础任务的基础上,多了一个等待状态。
任务包括 渲染、解析HTML和CSS 运行JavaScript代码 以及其他一些可能无法直接控制的工作 其中,编写并部署到网络上的「JavaScript是主要的任务来源之一」。...除了Web Workers和类似的API之外,所有这些都在主线程上执行。 主线程 在浏览器中,大部分任务都在主线程上运行。...由于事件处理程序有机会在较小的任务之间运行,它比等待长任务完成时运行要更快。 由于长任务的出现,它们可能会延迟FCP和TTI。在顶部的示例中,用户可能会感觉到延迟;而在底部,交互可能会感觉瞬间完成。...「用户交互元素可用:」 网页上的按钮、链接、表单等交互元素都已加载并且可以正常响应用户的点击、输入或其他操作。...在这个窗口中,浏览器不应处理主线程上「超过50毫秒的任何任务」,也不应等待「超过两个服务器响应请求」。
阻塞调用:比如 socket 的 recv(),调用这个函数的线程如果没有数据返回,它会一直阻塞着,也就是 recv() 后面的代码都不会执行了,程序就停在 recv() 这里等待,所以一般把 recv...于是A,B发生了循环等待,造成死锁。给用户的感觉就是程序卡着不动了。 在写代码的时候要特别注意共享资源的使用,用信号量控制好,避免造成死锁。...可以给线程里面写个死循环,或者让线程有任务的时候执行,没任务的时候挂起,就像iOS中的 runloop 机制一样。线程就不会随便的终止了。...CPU调度策略 在并发运行中,CPU需要在多个程序之间来回切换,那么如何切换就有一些策略。...3.4 最高响应比优先 用线程的等待时间除以服务时间,得到响应比,响应比小的优先运行。这样不会造成某些任务一直得不到响应。
在这篇博文中,我将介绍: 将你的后台任务定义为工作 定义特定的工作应该如何运行 运行你的工作 使用链进行存在依赖的工作 监视你的工作的状态 我还将解释 WorkManager 幕后发生的事情,以便你可以就如何使用它做出明智的决定...这个例子如上图所示 这个例子正是具有以下特点的任务: 可延迟的,因为你不需要它立即执行,而且实际上可能希望等待某些约束被满足(例如等待网络连接)。...保障 你的工作将会运行(即使你重启设备或应用程序退出,它也不会忘记运行你的工作)。 根据用户 API 级别的最佳实践运行(如上一篇文章所述)。...让我们探讨一下 WorkManager 如何确保你的工作脱离主线程运行并保证执行。...这也是使得 WorkManager 轻松应对对于不需要保障且只需要在后台线程上执行的任务的的原因。例如,假设你已经下载了图像,并且希望根据该图像更改 UI 部分的颜色。
并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已) 并行:指的是任务数小于等于cpu...> {'m': 20} >>> 子进程运行中,name= test,age=18 ,pid=3593... >>> {'m': 20} 进程和线程的区别 进程是资源调度的基本单位,而线程是程序执行的基本单位...不同进程的地址空间是独立的,而同一进程中的线程之间共享 进程之间通信必须使用操作系统提供的进程间通信机制,同一进程中的各线程可以直接通信 多进程之间可以并发执行,多线程之间也可以并发执行 线程切换的开销要比进程切换的开销小...运行结果 >>> 等待所有子进程完成... >>> 运行任务 0 (3722)... >>> 运行任务 1 (3723)... >>> 运行任务 2 (3724)... >>> 运行任务 3 (3725...请注意输出的结果,task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行,这是因为Pool的默认大小在我的电脑上是4,因此,最多同时执行4个进程。
,drop frame即扔掉当前运行的栈帧,这样当前“指针”的位置,就自然到了上一帧的位置。...三、多线程调试 多线程同时运行时,谁先执行,谁后执行,完全是看CPU心情的,无法控制先后,运行时可能没什么问题,但是调试时就比较麻烦了,最明显的就是断点乱跳,一会儿停这个线程,一会儿停在另一个线程,比如下图...: 如果想希望下一个断点位置是第2句诗句,可能要失望了: 如果想让线程在调试时,想按自己的愿意来,让它停在哪个线程就停在哪个线程,可以在图中3个断点的小红点上右击, 即:Suspend挂起的条件是按每个线程来...,我们可以选择线程“天空中的飞鸟” 断点如愿停在了第2句诗。...五、临时执行表达式/修改变量的运行值 调试时,可以临时执行一些表达式,参考下图:点击这二个图标中的任何1个都可以 点击+号后,就可以在新出现的输入框里输入表达式,比如i+5 然后回车,马上就能看到结果
上一篇介绍了ANR问题的相关知识,本篇介绍如何分析ANR问题。下面链接是我之前分析的一个ANR问题实例,实战与理论结合更容易理解。...2、 ANR类别:可以据此判断ANR超时时间,决定需要回溯多久查找ANR的原因。比如用户输入时间处理超时回溯5秒,广播超时回溯10秒。...主线程看上去和阻塞很相似,但通常会停在一个被频繁调用的原生公共模块,通常是窗口绘制或布局相关的方法上。 低性能问题通常比较难以判断,应当主要关注以下几个特征。...“恰好”停在一个被频繁调用调用的公共模块上,有点像玩击鼓传花,停在哪行代码上并不意味这行代码阻塞了整个程序的运行。...分析这类问题时就不能简单地看应用程序主线程堆栈停在哪里,而是要分析窗口生命周期各个方法的执行时间,找到运行迟缓的部分。Event.log中需要关注的信息主要有: ?
·此时显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求 ·如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务 2.多任务的概念 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务...multiprocessing模块就是跨平台版本的多进程模块。 multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束: ?...运行结果: ? 说明:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并肩元组或者字典中的参数按照顺序传递给参数。这里我的理解是当成单线程在执行。...timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full...下面的实例演示了进程池中的进程如何通信: ? 运行结果: ?
而是创建一个工作线程,并在那里完成大部分工作。这使得UI线程(驱动用户界面事件循环)保持运行,并阻止系统断定您的代码已冻结。因为这种线程通常是在类级别完成的,所以你可以将响应性视为一种类问题。...如何避免ANR Android应用程序通常完全在单个线程上运行,默认为“UI线程”或“主线程”。...这意味着您的应用程序在UI线程中执行的任何操作都需要很长时间才能完成,因为您的应用程序没有给自己处理输入事件或意图广播的机会。 因此,在UI线程中运行的任何方法都应该在该线程上尽可能少地工作。...主线程不应在等待工作线程完成时阻塞,而应提供Handler供其他线程在完成时回发。以这种方式设计应用程序将允许应用程序的UI线程保持对输入的响应,从而避免由5秒输入事件超时引起的ANR对话框。...因此,除了应该采取的措施之外,还有一些其他提示可以避免ANR,并使您的应用程序看起来对用户响应: 如果您的应用程序在后台运行以响应用户输入,请显示正在进行的操作(例如使用 ProgressBar 在你的用户界面
(手机横屏看源码更方便) ---- 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢?...简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池。...前情回顾 首先,让我们先回顾一下上一章写的线程池: (1)它包含四个要素:核心线程数、最大线程数、任务队列、拒绝策略; (2)它具有执行无返回值任务的能力; (3)它无法处理有返回值的任务; (4)它无法处理任务执行的异常...有返回值的任务就不一样了,主线程首先要提交任务到线程池中,它需要使用到任务执行的结果,所以它必须等待任务执行完毕才能拿到任务执行的结果。 那么,为什么不直接在execute的时候就等待任务执行完毕呢?...= new AtomicReference(); 然后,我们先来看看run()方法的逻辑,它其实就是先执行真正的任务,然后修改状态为完成,并保存任务的返回值,如果保存了主线程,还要唤醒它。
程序员将对应于程序和数据的已穿孔未的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片...它需要硬件支持,并令CPU调度其他硬件工作。 ...3)微观上串行:实际上,各道程序轮流地用CPU,并交替运行。...这些线程一起运转,让我们感觉到输入和显示同时发生,而不用键入一些字符等待一会儿才显示到屏幕上。在不经意间,Word还能定期自动保存。...从CPU角度线程无法提升性能,但如果某些线程涉及到等待资源(比如IO,等待输入)时,多线程允许进程中的其它线程继续执行而不是整个进程被阻塞,因此提高了CPU的利用率,从这个角度会提升性能(和多道程序设计相同
领取专属 10元无门槛券
手把手带您无忧上云