没有合适的资源?快使用搜索试试~ 我知道了~
15-消息队列和事件循环:页面是怎么“活”起来的?_For_vip_user_0011
需积分: 0 0 下载量 117 浏览量
2022-08-04
14:56:57
上传
评论
收藏 1.15MB PDF 举报
温馨提示
试读
11页
1. 添加个消息队列 2. IO线程中产的新任务添加进消息队列尾部 3. 渲染主线程会循环地从消息队列头部中读取任务,执任务
资源详情
资源评论
资源推荐
15-消息队列和事件循环:⻚⾯是怎么“活”起来的?15-消息队列和事件循环:⻚⾯是怎么“活”起来的?
前⾯我们讲到了每个渲染进程都有⼀个主线程,并且主线程⾮常繁忙,既要处理DOM,⼜要计算样式,还
要处理布局,同时还需要处理JavaScript任务以及各种输⼊事件。要让这么多不同类型的任务在主线程中有
条不紊地执⾏,这就需要⼀个系统来统筹调度这些任务,这个统筹调度系统就是我们今天要讲的消息队列和
事件循环系统。
在写这篇⽂章之前,我翻阅了⼤量的资料,却发现没有⼀篇⽂章能把消息循环系统给讲清楚的,所以我决定
⽤⼀篇⽂章来专⻔介绍⻚⾯的事件循环系统。事件循环⾮常底层且⾮常重要,学会它能让你理解⻚⾯到底是
如何运⾏的,所以在本篇⽂章中,我们会将⻚⾯的事件循环给梳理清楚、讲透彻。
为了能让你更加深刻地理解事件循环机制,我们就从最简单的场景来分析,然后带你⼀步步了解浏览器⻚⾯
主线程是如何运作的。
需要说明的是,⽂章中的代码我会采⽤C++来⽰范。如果你不熟悉C++,也没有关系,这⾥并没有涉及到任
何复杂的知识点,只要你了解JavaScript或Python,你就会看懂。
使⽤单线程处理安排好的任务使⽤单线程处理安排好的任务
我们先从最简单的场景讲起,⽐如有如下⼀系列的任务:
现在要在⼀个线程中去执⾏这些任务,通常我们会这样编写代码:
在上⾯的执⾏代码中,我们把所有任务代码按照顺序写进主线程⾥,等线程执⾏时,这些任务会按照顺序在
线程中依次被执⾏;等所有任务执⾏完成之后,线程会⾃动退出。可以参考下图来直观地理解下其执⾏过
程:
任务1:1+2
任务2:20/5
任务3:7*8
任务4:打印出任务1、任务2、任务3的运算结果
voidMainThread(){
intnum1=1+2;//任务1
intnum2=20/5;//任务2
intnum3=7*8;//任务3
print("最终计算的值为:%d,%d,%d",num,num2,num3);//任务4
}
第⼀版:线程的⼀次执⾏
在线程运⾏过程中处理新任务在线程运⾏过程中处理新任务
但并不是所有的任务都是在执⾏之前统⼀安排好的,⼤部分情况下,新的任务是在线程运⾏过程中产⽣的。
⽐如在线程执⾏过程中,⼜接收到了⼀个新的任务要求计算“10+2”,那上⾯那种⽅式就⽆法处理这种情
况了。
要想在线程运⾏过程中,能接收并执⾏新的任务,就需要采⽤事件循环机制要想在线程运⾏过程中,能接收并执⾏新的任务,就需要采⽤事件循环机制。我们可以通过⼀个for循环语
句来监听是否有新的任务,如下⾯的⽰例代码:
相较于第⼀版的线程,这⼀版的线程做了两点改进。
//GetInput
//等待⽤⼾从键盘输⼊⼀个数字,并返回该输⼊的数字
intGetInput(){
intinput_number=0;
cout<<"请输⼊⼀个数:";
cin>>input_number;
returninput_number;
}
//主线程(MainThread)
voidMainThread(){
for(;;){
intfirst_num=GetInput();
intsecond_num=GetInput();
result_num=first_num+second_num;
print("最终计算的值为:%d",result_num);
}
}
第⼀点引⼊了循环机制第⼀点引⼊了循环机制,具体实现⽅式是在线程语句最后添加了⼀个for循环语句for循环语句,线程会⼀直循环执
⾏。
第⼆点是引⼊了事件第⼆点是引⼊了事件,可以在线程运⾏过程中,等待⽤⼾输⼊的数字,等待过程中线程处于暂停状态,⼀
旦接收到⽤⼾输⼊的信息,那么线程会被激活,然后执⾏相加运算,最后输出结果。
剩余10页未读,继续阅读
是因为太久
- 粉丝: 19
- 资源: 295
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0