第12周 预习、实验与作业:Java并发编程
2024-10-21 12:56:43
以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?
- 最多只能做一件事
- 函数按着顺序执行,函数内按着语句执行。可以有多个可以有一个。
- 不一定。因为Main方法执行完之后,也许有线程未关闭,所以JVM肯定不会退出。如果在main加入System.exit(0)则会强制退出。
早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序的指令吗?如果不能,为什么我们可以边写程序边听歌?
- 不可以。单核只能同时处理一个。
- 因为计算机虽然指令多,但是cpu运算速度更快,让我们觉得在同时运行两个程序,实际上两个程序指令是来回执行的。
打开“资源监视器”观察你使用的QQ、浏览器或者WPS,一般有几个线程?思考一下,当你运行这些程序的时候,有哪些现象证明了这些程序使用了多个线程?
这里以微软edge为例子
以我个人理解,出现多个程序的原因有以下
- 我安装的edge扩展
- 我打开的网页(可能每一个没有关闭的网页都是一个线程)
- edge的更新检测服务
- edge的账号服务(同步自己的浏览历史等)
比如我在浏览bilibili的时候,我首先使用油猴开启了免会员,其次再由adground帮我免除广告,点击视频,不仅有视频输出还有声音输出(举例bilibili是因为bilibili为了省劲现在用的是硬件加速,也就是说它是占用cpu资源的)。单是访问这个网站看视频就已经有五个线程了。
运行“Bounce”与"BounceThread"两个程序。当你多次点击Start时,两个程序运行起来有何不同?为什么?
- 直观上来看,BounceThread按一次start就会出现一个球,而Bounce只能出现一个球(上一个球停止运动start点击才有效)。
- BounceThread使用了多线程操作。(这点有待补充)
思考:两个人只有一双筷子(用A、B分别表示这双筷子的两只),这两个人只有各自获A、B这两只筷子的候才能成功吃饭。可以想象,他们会产生冲突。尝试说明他们可能产生哪些冲突?怎么解决这些冲突?
AB可能产生的冲突(俩人用甲和乙代替):
- 甲拿A,乙拿B,俩人都不能吃饭(或者互换)。
- 甲先拿到AB,乙空手。但是乙有吃饭的需求,他只能用眼睛(监听器)观察甲,放下筷子才拿起AB吃饭。(或者互换)
- 甲和乙同时需要吃饭,同时需要AB两双筷子,但是俩人之间没有优先级(比如甲要让着乙),产生了竞争,他俩一个都吃不上饭。
解决办法:
- ①设立俩人绝对优先级,优先级高的那个人有需要必须先处理,无论乙是不是正在用还是需要用,一切以甲为准。
- ②设立一个相对优先级,比如同时需要吃饭,先让甲吃完,乙再吃。如果乙在吃的时候甲需要吃,则甲需要等待乙使用完毕,再吃。
- ③最简单的就是,再拿一双筷子,从硬件上解决问题(多核处理器)。
- ④最粗暴的就是,杀掉乙(结束进程),让甲自己独占筷子,从根源解决问题。
最新文章
- 通过transform修改位置 大小 旋转 形变
- jQuery Ion.Calendar 日期/日历
- eclispe或者myeclispe maven jar包不能部署到tomcat下
- Hiho 1232 北京网络赛 F Couple Trees
- iOS 消息推送报错NSCocoaErrorDomain Code=3000
- 下载老版本的Xcode
- hdu2874 LCA
- JNI文件中命名类与JAVA文件中匹配
- usb转串口如何配置?
- background:url 的使用方法
- Yii学习笔记之三(在windows 上安装 advanced )
- 扯蛋css
- Output\TEST.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
- vue指令v-on示例解析
- 对The C programming language一书第6.6节代码的理解
- LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <;c++>;
- servlet 拦截器 (filter)
- ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法
- JS判断手机还是电脑访问网站
- 系统编码、文件编码与python系统编码