首页
学习
活动
专区
圈层
工具
发布

【Kotlin 协程】协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

文章目录 一、协程挂起 和 线程阻塞 对比 1、协程挂起 2、线程阻塞 3、挂起和阻塞对 UI 的影响 4、挂起分析 一、协程挂起 和 线程阻塞 对比 ---- 挂起是协程中的概念 , 只能在协程中使用...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 2、线程阻塞 主线程 阻塞 操作 : 在主线程 中使用 Thread.sleep 函数 , 阻塞 20...秒时间 , 然后 20 秒后更新 UI ; // 主线程阻塞 Thread.sleep(20000) // 主线程更新 UI Log.i("MainActivity", "GlobalScope :...主线程更新 UI") 3、挂起和阻塞对 UI 的影响 协程 挂起 操作 不会出现 阻塞 UI 刷新的情况 , 挂起的 20 秒不影响 UI 刷新显示 ; 但是如果将主线程阻塞 , UI 不再刷新 , 会出现..., ANR 崩溃异常 ; 4、挂起分析 协程中有挂起操作 , 会将挂起点的状态保存 , 同时协程停止执行 , 等待挂起函数执行完毕后 , 协程继续执行 ; 相当于阻塞的是协程 , 不会阻塞主线程 ;

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

    将 asyncawait 异步代码转换为安全的不会死锁的同步代码

    这种方法会阻塞调用线程。...安全的方法 传统方法的坑在于 UI 线程无响应和死锁问题。既要解决无响应问题,又要阻塞调用方,可选的方法就是 Windows 消息循环了。...所以,我考虑使用 PushFrame 来阻塞当前线程并创建一个新的消息循环。使用 Task.ContinueWith 来恢复阻塞,而不使用 Task 中默认同步所采用的同步上下文。.../// 由于使用了消息循环,所以并不会阻塞 UI 线程。 /// 此方法适用于将一个 async/await 模式的异步代码转换为同步代码。...新方法的适用范围和优劣 事实上,虽然我们使用了消息循环,但其实也适用于控制台程序,适用于各种各样奇奇怪怪的线程 —— 无论是 UI 线程还是非 UI 线程,无论是 STA 还是 MTA。

    2.1K10

    Java集合--非阻塞队列(ConcurrentLinkedQueue基础)

    阻塞,顾名思义:当我们的生产者向队列中生产数据时,若队列已满,那么生产线程会暂停下来,直到队列中有可以存放数据的地方,才会继续工作;而当我们的消费者向队列中获取数据时,若队列为空,则消费者线程会暂停下来...在底层,非阻塞队列使用的是CAS(compare and set)来实现线程执行的非阻塞。 非阻塞队列的操作 与阻塞队列相同,非阻塞队列中的常用方法,也是出队和入队。...ConcurrentLinkedQueue ConcurrentLinkedQueue是一个线程安全的队列,基于链表结构实现,是一个无界队列,理论上来说队列的长度可以无限扩大。...引言:在笔者研究源码时,发现无论是idea,还是eclipse,在debug模式下,跟踪ConcurrentLinkedQueue源码时都会产生bug,具体情况就是debug控制台中类的内存地址和实际的内存地址不一致...详细描述,可参考如下内容:神奇的控制台 解决方案:将ConcurrentLinkedQueue源码拷出,本地新建一个类,使用run执行,在方法的前后增加自己的输出语句,打印出实际的内存地址,便可一探究竟

    2.1K60

    线程间通讯:WaitHandler使用实例及分析

    实例效果: 1.点击“启动线程”会启动一个线程t每隔2秒在listbox上插入一条新记录。 2.点击“关闭线程”会停止线程t,但不是马上停止而是等待线程t当次循环的工作后再结束。...(0, false))//阻塞当前线程(这里又只阻塞0秒),直到ui线程赐死线程t 32 { 33 Stoped.Set();//...而WaitOne()就是阻塞当前线程直到实例被设为终止状态,而WaitOne()方法有多个重载方法,可以设定阻塞时间,超过了阻塞时间实例状态依然为非终止的话就放弃阻塞,让线程继续执行WaitOne语句以下的内容...检查线程t是否已死的过程是一直占用ui线程的,而窗口上控件的交互也是由ui线程来处理,这时会出现画面假死的状态,如果发出了调用ui线程处理其他事件的话就会有异常。...注意:这时ui线程是可用的,只是正忙于处理第一个消息,如果ui线程挂起来了、阻塞了或死了Application.DoEvents()无法使让ui线程处理消息队列中的其他消息。

    79750

    IDEA集成Java性能分析神器JProfiler

    《eclipse集成Java性能分析神器JProfiler》讲解了eclipse集成Jprofiler,这篇讲解一下IDEA如何集成JProfiler。 1、在JProfiler中配置IDEA ?...这里并不同于Eclipse选择Eclipse的安装目录。IDEA选择的是配置目录,啥为配置目录了呢?...e.printStackTrace(); } } System.out.println("test JProfiler end"); } } 启动程序后控制台打印如下信息并启动...线程视图thread views JProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现。对线程剖析。...当前监视器 Current Monitors :显示当前正在等待或阻塞中的线程操作。 锁定历史图表 Locking History Graph :显示记录在JVM中的锁定历史。

    6.6K10

    使用 Task.Wait()?立刻死锁(deadlock)

    如果 _dispatcher.BeginInvoke(_priority, d, state); 这句代码在后台线程,那么此时 UI 线程处于 Wait()/Result 调用中的阻塞状态,BeginInvoke...不在后台线程执行怎么做到的异步等待!!! 是的,读写文件,访问网络,这些 IO 阻塞的操作执行时,里面根本就没有线程,详情请阅读:There Is No Thread。...另外,如果是控制台程序,或者一个普通的非 UI 线程,其 SynchronizationContext 为 null,那么异步任务执行完后不需要回到原有线程,也不会造成死锁。...总结不会造成死锁的充分条件: 异步操作执行完后不需要回到原有线程(例如非 UI 线程和控制台线程); 异步操作不需要单独的线程执行任务。 如何避免死锁?...如果可能,尽量在异步任务后添加 .ConfigureAwait(false);这样,异步任务后面继续执行的代码就不会回到原 UI 线程了,而是直接从线程池中再取出一个线程执行;这样,即便 UI 线程后续可能有别的原因造成阻塞

    1.4K10

    JVM-监控及诊断工具

    在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。...开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项配置。...,要留意下面几种状态 死锁,Deadlock(重点关注) 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 阻塞...,Blocked(重点关注) 执行中,Runnable 暂停,Suspended 对象等待中,Object.wait() 或 TIMED_WAITING 停止,Parked jcmd:多功能命令行 在...Jconsole jconsole:从Java5开始,在JDK中自带的java监控和管理控制台。

    1.2K40

    iOS开发遇到的一些小问题记录

    改成用 UIButton Action的方式有效,仔细搜索并分析发现问题主要是 在viewdidload周期内的segue会被最后更新的UI视图覆盖掉、也就是当前页面的主视图。所以看不出效果。...UI接口在后台线程调用问题 封装了一个loading、alert模块,测试中经常出现控制台报 Main Thread Checker: UI API called on a background thread...,并且偶尔会直接造成崩溃 出现这个问题主要原因是,通常的UI界面(UIViewController)中的内容都是在主线程中运行、而很多其他的功能 诸如支付队列等 是在后台线程中运行、主线程是UI阻塞的,...而后台线程是非阻塞的,当非阻塞线程中的某个函数在循环的时候向某个UI发起调用,如果在主线程中,这个函数就已经被阻塞了,而后台线程不会,这时重复向UI发起调用,就可能导致指针冲突等意外问题。...解决:在iOS开发中,使用delegate方式可以用来解决后台线程调用问题。 实际上这个时候是 UI, 后台线程组件 分开运行在 主线程、后台线程中。 后台线程通过delegate向主线程发起调用。

    1.3K10

    【从零开始的Qt开发指南】(十八)Qt 事件进阶:定时器、事件分发器与事件过滤器的实战宝典

    步骤 2:设计 UI 界面 打开widget.ui,拖入两个QLabel控件,分别命名为lb1和lb2,用于显示计数结果(可设置字体大小和对齐方式,方便观察)。...步骤 1:设计 UI 界面 打开widget.ui,拖入一个QLabel(命名为label)、两个QPushButton(分别命名为btn1和btn2,文本改为 “开始” 和 “停止”)...,控制台输出 “定时器启动!”; 点击 “停止” 按钮,计数停止,控制台输出 “定时器停止!”; 再次点击 “开始”,计数从当前值继续累加,无需重新初始化。...” 按钮,时间停止更新。...1.5 定时器使用避坑指南 定时器精度问题:Qt 定时器基于系统事件循环,若主线程阻塞(如复杂计算),定时器会延迟触发,需在子线程中使用定时器处理高精度需求; 内存管理:QTimer对象若指定父对象(如

    24710

    看过这么多爆文,依旧走不好异步编程这条路?​

    大家都知道:WinForm和WPF都有类似的原则:长耗时的任务在后台进行,将异步结果返回给UI线程 。(这难道就是ConfigureAwait方法默认传true的原因?)...此时就需要捕获UI线程的SynchronizationContext,并将这个对象传入异步任务。...引言代码为什么发生deadlock 观察引言代码,控制权返回到上层调用函数时,执行流使用Result/(Wait方法)等待任务结果:Result/Wait()导致调用线程同步阻塞(等待任务完成), 而异步任务执行完成后...ConfigureAwait(false) 能解决[因调用线程同步阻塞]引发的死锁,但是同步阻塞没有利用异步编程的优点,不是很推荐。...NET Core和控制台程序,因为捕获的SynchronizationContext=null, 会选择一个线程同步上下文来执行,不会死锁。

    1.1K20

    【从零开始的Qt开发指南】(二十)Qt 多线程深度实战指南:从基础 API 到线程安全,带你实现高效并发应用

    ID:" << QThread::currentThreadId(); } Widget::~Widget() { // 停止线程并等待结束,避免资源泄漏 timeThread->terminate...; text-align: center;"); } 运行效果 点击 “启动计时” 按钮,线程启动,timeLabel每秒更新一次当前时间; 主线程界面始终流畅,可正常拖拽、关闭; 控制台输出主线程和子线程的...->start(); } MainWindow::~MainWindow() { delete ui; } 运行效果 控制台输出如下(数据错乱): 线程 0x7f8c3c000b80...会阻塞,直到有线程释放资源; 适用于需要限制并发访问数量的场景,比互斥锁更灵活。...,稍后执行(跨线程安全); Qt::BlockingQueuedConnection:发送线程阻塞,直到槽函数执行完毕(可能导致死锁,需确保发送线程和接收线程不是同一线程)。

    49310

    QT软件开发: QProcess启动进程完成交互并获取输出

    进程有两个预定义的输出通道:标准输出通道(stdout)提供常规控制台输出,标准错误通道(stderr)通常提供进程打印的错误。这些通道代表两个独立的数据流。...QProcess提供了一组函数,允许在没有事件循环的情况下使用它,方法是挂起调用线程,直到发出某些信号: waitForStarted()会一直阻塞,直到进程启动。...waitForReadyRead()阻塞,直到新数据可用于当前读取通道上的读取。 waitForBytesWrite()阻塞,直到一个有效负载的数据被写入进程。...waitForFinished()阻塞,直到进程完成。 从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致用户界面冻结。...>text().toLocal8Bit()); } /* 工程: untitled1 日期: 2021-07-28 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 停止命令

    10.9K41

    PyQt5信号、定时器及多线程

    import time class MyWindow(QtWidgets.QWidget,Ui_Form): _signal=QtCore.pyqtSignal(str) #定义信号,...计算完成后,计时器停止。这是一个很简单的应用,也看不出有任何问题。但是当我们开始运行程序时,问题就来了:点击按钮之后,程序界面直接停止响应,直到循环结束才开始重新更新,于是计时器使用显示0。   ...这是因为 Qt 中所有界面都是在 UI 线程中(也被称为主线程,就是执行了QApplication::exec()的线程),在这个线程中执行耗时的操作(比如那个循环),就会阻塞 UI 线程,从而让界面停止响应...界面停止响应,用户体验自然不好,不过更严重的是,有些窗口管理程序会检测到你的程序已经失去响应,可能会建议用户强制停止程序,这样一来程序可能就此终止,任务再也无法完成。...而在按钮点击的槽函数中,使用work()中的workThread.start()函数启动一个线程(注意,这里不是run()函数)。再次运行程序,你会发现现在界面已经不会被阻塞了。

    2.7K10

    【从零开始的Qt开发指南】(二十二)Qt 音视频开发宝典:从音频播放到视频播放器的实战全攻略

    框架无缝衔接,容易出现线程阻塞、界面卡顿等问题。...:Qt 音视频播放默认采用非阻塞模式,不会阻塞 UI 线程,确保界面流畅响应; 资源路径:播放本地音视频文件时,需指定正确的文件路径(绝对路径或 Qt 资源文件路径)。...; } } 步骤 5:运行效果 点击 “播放音效” 按钮,即可播放指定的 WAV 音效; 多次点击按钮,音效会重复播放(支持叠加); 控制台输出 “音效播放中...”,提示播放状态。...” 按钮,播放停止,进度条重置为 0。...解决方案: 避免在 UI 线程中执行耗时操作(如文件解析、大数据处理); 确保音视频播放采用非阻塞模式(Qt 默认),不调用waitForFinished()等阻塞函数; 减少进度更新频率,避免positionChanged

    24610

    aardio中的多线程

    多线程开发基本规则 多线程开发时要谨记以下基本规则。 1、非主线程的错误信息默认只会输出到控制台。...只有用 console.open() 或 io.open() 打开控制台才能看到非主线程的错误信息。 2、每个线程有独立的运行上下文、独立的全局变量环境,有独立的堆栈。...",thread.getId()) } ) web.form不支持多线程 先看一个例子 import win.ui; /*DSG{{*/ var winform = win.form(text="线程测试...要想不阻塞主线程就要用多线程,但是var mb = web.form.ie11(winform);,其中的mb是不支持线程间传递的,所以没有什么更好的方法。...invokeAndWait 我们有时候在界面中创建一个线程,仅仅是为了让界面不卡顿,我们希望用 thead.waitOne() 阻塞等待线程执行完闭(界面线程同时可以响应消息),然后我们又希望在后面关闭线程句柄

    1.9K51

    Android 开发艺术探索笔记二

    Android 8.0源码 WMS创建涉及三个线程,分别是system_server、android:display、android:ui之间关系 首先system_server线程中执行了systemServer...的init方法,PWM的init方法会在android:ui线程中运行,它的优先级要高于android:display线程,因此android:display要等待init方法执行完毕后,android...表示包含已经停止的应用,广播会发送给停止的应用。...,将最终结果传递给主线程中,并在主线程中更新UI,它封装了Thread与handler AsyncTask线程池配置的参数: 核心线程数等于CPU核心数+1 最大线程数为CPU核心数2倍+1 核心线程无超时时长...AsyncTask对象必须在主线程中创建 execute必须在UI线程调用 不要再程序中直接调用onPreExecute,doInBackground,onProgressUpdate方法 一个AsyncTask

    2.4K10
    领券