首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin 协程上下文和调度器介绍-Dispatchers

而我们通常在使用launch 或者async可以通过可选参数定义CoroutineContext 对象。然后它会帮我们指定一个调度器对象。...受限调度器是一种高级机制,可以在某些极端情况下提供帮助而不需要调度协程以便稍后执行或产生不希望作用, 因为某些操作必须立即在协程中执行。受限调度器不应该在通常代码中使用。...因此它与这个启动作用无关且独立运作。...但是子协程仍然处于活动状态,那么整个协程就仍然属于活动状态。 当然,我们如果主动调用.cancel() 那么子协程还没有运行完也会被强制结束了。 这就是协程中父子协程之间关系了。...// 它是使用Dispatchers.Main作为调度器适配UI线程 private val mainScope = MainScope() //关闭时候 取消作用 fun

32310

Web性能优化之Worker线程(下)

返回服务工作线程作用「完整 URL 路径」 2....作用限制 ❝服务工作线程「只能拦截其作用内」客户端发送请求 ❞ 「作用是相对于获取服务脚本路径定义」。如果没有在 register()中指定,则作用就是服务脚本路径。...),以及当前使用了多少空间 navigator.storage.estimate() .then(console.log); 线程客户端 服务工作线程使用 Client 对象跟踪「关联窗口」、「...该方法可用于回应点击通知操作,此时服务工作线程可以检测单击事件并作为响应打开一个窗口 claim(): 1. 强制性设置当前服务工作线程以控制其作用域中所有客户端。...如果没有「活动」服务工作线程,则新安装服务工作者线程会跳 到这个状态,并直接进入激活中状态,因为没有必要再等了。

2.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

Android面试题之Kotlin协程一文搞定

我们无法直接访问这些状态,可以通过访问Job属性:isActive、isCancelled和isCompleted 如果协程处于活跃状态,协程运行出错或是调用job.cancel(),都会将当前任务置为取消中...,而runBlocking是在主线程中 协程作用构建器 coroutineScope、runBlocking、supervisorScope runBlocking是常规函数,会阻塞当前线程;coroutineScope...是挂起函数,不会阻塞当前线程 它们都会等待协程体以及所有子协程结束,一个是阻塞线程等待,一个是挂起等待 协程作用构建器 coroutineScope、supervisorScope coroutineScope...和CoroutineScope coroutineScope是一个挂起函数,是协程作用构建器,CoroutineScope()是一个普通函数 coroutineScope后面的协程作用协程上下文是继承父协程作用上下文...CoroutineScope()有自己作用上下文 都能够进行解构化并发,可以很好管理多个子协程 协程取消 取消作用会取消它子协程 被取消子协程不会影响其余兄弟协程 协程通过抛出一个特殊异常

5010

WorkBox 之底层逻辑Service Worker

Cache API可以在Service worker作用内和「主线程作用内访问。该特性为用户操作与 Cache 实例交互提供了许多可能性。...因为service worker「已经注册并处于活动状态」,它正在「控制」页面。将显示一个包含service worker作用当前状态和其 URL 表单。...在这里,作用是整个origin,因为它是从根目录加载。 当注册开始,service worker状态被设置为installing。 ❝一旦注册完成,「安装」就开始了。 ❞ 2....假设service workerURL或作用未更改,「只有在其内容发生变化时,当前安装service worker才会更新到新版本」。...当Service Worker处于活动状态,强制刷新也将完全绕过Service Worker。

29220

kotlin--协程启动和取消

,那么该协程将直接进入异常结束状态 4.UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起点 1-3是需要调度器,还记得我们前面学习过调度器么,如果调度器中线程池满了...1.runBlocking与coroutineScope runBlocking是常规函数,它会阻塞主线程,而coroutineScope是挂起函数,它们都会等待其协程体和子协助执行结束,作用构建器使用是父协程上下文...二、协程取消 1.协程取消 1.取消作用会取消它子协程,CoroutineScope是创建一个全新协程上下文,和coroutineScope作用是不同作用构建器使用是父协程上下文 fun...2.CPU密集型任务取消 1.isActive是一个可以被使用在CorountineScope中扩展属性,检查Job是否处于活跃状态 fun `test cancel cpu`() = runBlocking...println("finished") } 结果: sleep:0 sleep:1 sleep:2 start cancel finished 2.ensureActive函数,如果job处于活跃状态

94130

Kotlin中协程及在Android中应用

通过一个协程作用扩展方法async启动一个协程,不会阻塞调用它线程,返回值是 Deferred。...{ Log.e("协程","我们使用launch启动了一个协程") } GlobalScope.async { Log.e("协程","我们使用async启动了一个协程") } 作用...比如:网络请求,数据库操作,文件操作等 Main:UI调度器,只有在UI编程平台上有意义,用于更新UI,例如Android中线程 Unconfined:受限调度器,无所谓调度器,当前协程可以运行在任意线程上...我们前面查看launch和async方法,看到他们第一个参数都是context: CoroutineContext ,是的,我们可以从这里传入我们需要上下文,并且会覆盖掉协程作用上下文。...rememberCoroutineScope() 会创建一个协程作用对象,并将其与当前 Composable 生命周期相关联。

11910

带你了解浏览器工作过程

作用链:变量查找沿着各作用一层层向外部引用指向执行上下文查找,形成一个链条,即作用链条 函数作用由词法作用决定 词法作用:是指作用是函数声明位置来决定,和函数怎么调用无关 3....手动回收,如设置变量为null 自动回收 (1)栈内存回收 当Javascript代码执行时,记录当前执行状态指针(称为 ESP),指向当前执行上下文指针,当前函数代码之前完毕,指针下移指向下一个要执行函数执行上下文...(老生代垃圾数据) 副垃圾回收器:负责回收生存时间短垃圾数据(新生代垃圾数据) 第一步,标记堆内存中活动对象和活动对象 活动对象:还在使用数据 活动对象:垃圾数据 第二步,回收活动数据所占据内存...状态promise,进入后面的then catch执行失败,返回是一个rejectedpromise,进入后面的catch async/await async/await出现原因:undefinedPromise...CSRF攻击,跨站请求伪造(Cross Site Request Forgery) 目的是利用服务器漏洞和用户登录状态来实施攻击 发起CSRF攻击方式: 通过,自动跳转到恶意网站

1.6K40

协程三问—快手真题

协程,kotlin中一个神奇组件,由于使用方便任意切换被广大开发者使用,今天就来看看协程: 说说你对协程理解 说下协程具体使用 协程怎么取消 说说你对协程理解 在我看来,协程和线程一样都是用来解决并发任务...所以协程和线程是属于一个层级概念,但是对于kotlin中协程,又与广义协程有所不同。kotlin中协程其实是对线程一种封装,或者说是一种线程框架,为了让异步任务更好更方便使用。...(parameter1) } val value2 = async { request2(parameter2) } val value3 = async { request3(parameter3...// 协程作用 scope val job1 = scope.launch { … } val job2 = scope.launch { … } scope.cancel() 取消子协程 // 协程作用...比如上述job1,正常情况处于active状态,调用了cancel方法后,协程会变成Cancelling状态,工作完成之后会变成Cancelled 状态,所以可以通过判断协程状态来停止工作。

44930

Kotlin协程系列(三)

2.launch函数启动一个协程   在Android开发中,我们一般将协程作用和Android组件lifeCycle绑定在一起,这样,当组件销毁时候,协程作用就会取消,协程也就销毁了,这样不会造成内存泄漏...在ViewModel中,我们可以直接使用viewModelScope这个作用去创建协程,在Activity/Fragment这些拥有生命周期组件中,我们可以使用lifecycleScope去创建协程...LAZY:只有协程被需要,包括主动调用start,join,await等函数才会开始调度,如果调度前被取消协程就会进入异常结束状态 UNDISPATCHED:协程创建之后立即在当前函数调用栈中执行...lauch函数返回值是Job对象,Job对象常用属性和函数如下: isActive:判断Job是否处于活动状态 isCompleted:判断Job是否属于完成状态 isCancelled:判断Job...而且有了withContext之后,在Android开发时候,就可以不再使用Handler了,我们可以在需要进行耗时操作(网络请求,数据库读写,文件读写)使用withContext切换到IO线程

22810

Kotlin 学习笔记(四)—— 协程基础知识,面试官最爱了~

3.2 协程调度器 在 3.1 中已经出现过调度器身影,就是当需要指定协程运行线程使用调度器调度即可。在实际使用中是通过 Dispatchers 对象来访问它们。...; UNDISPATCHED:表示协程创建后立即在当前函数调用栈中执行,是运行在协程创建所在线程。...GlobalScope:通常被用于启动一个顶级协程(顶级协程是顶级作用,即没有父协程作用),这种协程生命周期是会伴随应用整个生命周期,不会被取消掉,所以要非常谨慎使用,容易造成内存泄漏。...使用 MainScope 需要注意,在当前 UI 页面将要被回收,需要调用 cancel 方法取消,避免内存泄漏。...在等待子 job 完成也是处于活跃状态;isCompleted:true 表示 job 因为某种原因已经完成,值得注意是,如果 job 被取消或者执行失败,也是已经完成状态;父 job 只有当所有子

1.4K30

Kotlin 协程之Practice

//可以使用 coroutineScope 构建器来声明你自己作用。...它启动了一个新协程作用并且在所有子协程执行结束后并没有执行完毕。     ...// runBlocking 和 coroutineScope 主要不同之处在于后者在等待所有的子协程执行完毕并没有使当前线程阻塞     private fun testCoro() = runBlocking...对象一个轻量级阻塞future,使用await在一个延期值上得到结果,它是一个接口继承自Job对象,也就是说它也是一个job对象,可以进行取消操作     //async 风格函数   该函数不是挂起函数...挂起后,它将完全由所运行线程中恢复挂起函数,     //受限调度器是合适,它在协程没有消耗CPU时间或共享数据被限制在指定线程中     fun testDispatcherMain() =

1.1K20

Spring系列四:Bean Scopes作用

在这六个范围中,只有在使用支持WebapplicationContext,其中四个可用。singleton和prototype作用可用于任何类型ioc容器。...prototype 与单例相反,每次请求bean,它都会创建一个新实例。 request 在HTTP请求(Request) 完整生命周期中,将创建并使用单个实例。...每次应用程序对Bean进行请求,原型作用都会创建一个新Bean实例。...request作用 在请求范围中,容器为每个HTTP请求创建一个新实例。因此,如果服务器当前处理50个请求,那么容器最多可以有50个bean类单独实例。...自定义线程作用 Spring还使用类SimpleThreadScope提供了默认线程作用。若要使用作用,必须使用CustomScopeConfigurer类将其注册到容器。

81310

前端面试指南--JS面试题总结

ES6中有全局作用、函数作用和块级作用三层概念。 当一个变量在当前块级作用域中未被定义,会向父级作用(创建该函数那个父级作用)寻找。...(1)函数执行上下文只在函数被调用时生成,而其作用在创建已经生成; (2)函数作用会包含若干个执行上下文(有可能是零个,当函数未被调用时)。 9. this指向各种情况都有什么?...参考 前端进阶面试题详细解答10.如何改变this指针指向?可以使用apply、call、bind方法改变this指向(并不会改变函数作用)。...Promise缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生错误无法捕获; (3)当处于pending状态,无法得知其具体发展到了哪个阶段...定时器中回调会在执行栈被清空且定时达成推入执行栈中执行。 promise、async异步函数回调会被推入到微任务队列中,当执行栈被清空且异步操作完成立即执行。

85530

前端面试指南之JS面试题总结2

ES6中有全局作用、函数作用和块级作用三层概念。 当一个变量在当前块级作用域中未被定义,会向父级作用(创建该函数那个父级作用)寻找。...(1)函数执行上下文只在函数被调用时生成,而其作用在创建已经生成; (2)函数作用会包含若干个执行上下文(有可能是零个,当函数未被调用时)。 9. this指向各种情况都有什么?...参考 前端进阶面试题详细解答10.如何改变this指针指向?可以使用apply、call、bind方法改变this指向(并不会改变函数作用)。...Promise缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生错误无法捕获; (3)当处于pending状态,无法得知其具体发展到了哪个阶段...定时器中回调会在执行栈被清空且定时达成推入执行栈中执行。 promise、async异步函数回调会被推入到微任务队列中,当执行栈被清空且异步操作完成立即执行。

77620

前端面试指南之JS面试题总结

当一个变量在当前块级作用域中未被定义,会向父级作用(创建该函数那个父级作用)寻找。如果父级仍未找到,就会再一层一层向上寻找,直到找到全局作用为止。这种一层一层关系,就是作用链 。...作用和执行上下文区别是什么?(1)函数执行上下文只在函数被调用时生成,而其作用在创建已经生成; (2)函数作用会包含若干个执行上下文(有可能是零个,当函数未被调用时)。...10.如何改变this指针指向?可以使用apply、call、bind方法改变this指向(并不会改变函数作用)。...Promise缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生错误无法捕获; (3)当处于pending状态,无法得知其具体发展到了哪个阶段...定时器中回调会在执行栈被清空且定时达成推入执行栈中执行。 promise、async异步函数回调会被推入到微任务队列中,当执行栈被清空且异步操作完成立即执行。

79200

Kotlin协程解析系列(上):协程调度与挂起

其中GlobalScope本身就是一个作用,launch属于其子作用。 CoroutineScope.launch() 启动一个新协程而不阻塞当前线程,并返回对协程引用作为一个Job。...启动协程需要作用,但是作用又是在协程创建过程中产生。 图片 官方提供常用作用: runBlocking: 顶层函数,可启动协程,但会阻塞当前线程 GlobalScope 全局协程作用。...当这个作用域中任何一个子协程失败,这个作用失败,所有其他子协程都被取消。...会与当前UI组件绑定生命周期,界面销毁该协程作用将被取消,不会造成协程泄漏,推荐使用。...等作用进行使用,异常丝滑好用。

1.7K40

来聊聊C++中头疼线程、并发

example.try_lock()==true){ //拿到锁,做事 }else{ //没拿到锁做事 } unique_lock成员函数 lock() //可以手动加锁,手动加锁后,你可以不用手动开锁,离开作用后自动放锁...函数把自身阻塞(block)并挂到条件变量线程队列中 若满足该条件,拥有互斥锁线程在临界区内访问共享资源,在退出临界区通知(notify)在条件变量线程队列中处于阻塞状态线程,被通知线程必须重新申请对该互斥锁加锁.... std::launch::async在调用async函数,就开始创建线程 async函数默认用就是std::launch::async标记 #include #include...,该std::atomic_flag对象在创建处于clear状态。...() 默认构造函数,由默认构造函数创建 std::atomic 对象处于未初始化(uninitialized)状态,对处于未初始化(uninitialized)状态 std::atomic对象可以由

4.6K41

Kotlin 协程实现原理解析

协程作用协程作用CoroutineScope 是管理协程生命周期一种方式,它包含一个 Job,可以用来取消所有相关联协程,避免内存泄漏。...此外,Kotlin还提供了一些预定义作用,如GlobalScope是一个全局作用,它生命周期与应用程序一致。...在结构化并发中,可以使用coroutineScope函数创建一个新作用,它会等待所有启动子协程完成后才会继续执行。...当挂起函数暂停当前执行状态被封装在Continuation对象中,包括函数参数、局部变量和返回点。协程调度器可以使用这个对象在适当时候恢复函数执行。...当协程被创建,它处于创建状态;当调度器开始执行协程,它进入运行状态;当遇到挂起点,协程进入挂起状态;当协程执行完毕,它进入完成状态

39410

异步JS中Web Workers

运行在另一个全局上下文中, 有自己作用, 与当前 window 不同, 也无法直接访问Window对象....[MDN解释] 简单理解, 其实就是有一个独立于当前网页线程后台线程, 在网页发起请求进行代理,并缓存相关文件, 以便用户可以进行离线访问....通常是基于当前 location来解析传入路径. const registerServiceWorker = async () => { if ('serviceWorker' in navigator... Service Workers 中可以看到对应 SW一些状态记录, 以及可以对其进行相应操作 同样使用 chrome 开发者工具, 可以查看 SW 线程一些相关信息, 以及终止 SW 线程...其实除了 Web Workers 中线程, Nodejs中同样也有相应线程处理方式, 可见多线程作用之大.

1.5K20
领券