课前任务列表
- 1、以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?
- 2、早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序的指令吗?如果不能,为什么我们可以边写程序边听歌?
- 3、打开“资源监视器”观察你使用的QQ、浏览器或者WPS,一般有几个线程?思考一下,当你运行这些程序的时候,有哪些现象证明了这些程序使用了多个线程?
- 4、运行“Bounce”与"BounceThread"两个程序。当你多次点击Start时,两个程序运行起来有何不同?为什么?
- 5、思考:两个人只有一双筷子(用A、B分别表示这双筷子的两只),这两个人只有各自获A、B这两只筷子的候才能成功吃饭。可以想象,他们会产生冲突。尝试说明他们可能产生哪些冲突?怎么解决这些冲突?
1、以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?
①在传统的单线程 Java 程序中,同一时刻只能做一件事情,按照顺序依次执行代码语句,只有一个执行流程,也就是沿着 main 方法里的代码从上到下按顺序执行,若有方法调用则进入被调用方法继续按顺序执行,执行完后返回 main 方法继续向下执行。
②通常情况下,如果整个程序只有 main 方法在执行逻辑,main 方法执行完了,整个 Java 程序就会退出。
如果在 main 方法中启动了其他线程,即便 main 方法执行完毕,只要那些启动的线程还没有执行完其任务,程序就不会退出,会继续等待这些线程执行结束后才退出。
2、早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序的指令吗?如果不能,为什么我们可以边写程序边听歌?
早期单核 CPU 是否能同时执行两个程序指令: 早期的单核 CPU 不能真正意义上同时执行两个程序的指令,因为单核 CPU 在同一时刻只能处理一条指令,它只有一个处理核心,不具备同时并行处理多个指令流的硬件能力。
为何可以边写程序边听歌的原因: 虽然单核 CPU 不能同时执行多个程序指令,但操作系统采用了 “分时复用” 的机制来实现多任务的 “假象”。它会将 CPU 的时间划分成一个个极小的时间片(比如每个时间片可能是几毫秒等),快速地在不同程序(如编写程序的软件和音乐播放软件)之间进行切换,轮流分配时间片让它们执行各自的指令。由于时间片切换速度非常快,对于用户来说,感觉就好像是同时在边写程序边听歌一样。例如,在 1 秒钟内,可能先给文字处理软件分配 5 毫秒去执行保存文档等操作,然后马上切换给音乐播放软件分配 5毫秒去读取音频数据并播放等,如此反复切换,在宏观上呈现出多个程序同时运行的效果。
来自AI的回答
3、打开“资源监视器”观察你使用的QQ、浏览器或者WPS,一般有几个线程?思考一下,当你运行这些程序的时候,有哪些现象证明了这些程序使用了多个线程?
- 抖音:如下图所示
- 证明抖音使用多个线程的现象 :流畅的视频播放与交互操作同时进行,当我们在抖音上观看视频时,我们可以在视频播放过程中进行点赞、评论、转发等操作。这表明有不同的线程分别负责视频播放(视频解码和音频处理线程等协同工作)和用户交互操作(界面渲染和交互响应线程等)。例如,我在观看一个热门视频时,视频能够流畅地播放,同时我可以立即点击点赞按钮,点赞操作会立即得到响应(如点赞数量增加、出现点赞动画等),这说明处理视频播放和处理用户交互的线程是独立工作的。
4、运行“Bounce”与"BounceThread"两个程序。当你多次点击Start时,两个程序运行起来有何不同?为什么?
两组程序的主要区别在于它们如何处理多个球的动画,前者只能在前一颗球到终点之后才可以继续发出下一颗球,后者可以在前一颗球未到达终点时便可发出下一颗球,界面可以同时出现多颗球。
Bounce程序运行如下图所示:
BounceThread程序运行如下图所示:
这种差异的原因在于第一组程序没有利用多线程来处理多个动画任务,而第二组程序通过为每个球创建新线程来实现动画的并行处理。
5、思考:两个人只有一双筷子(用A、B分别表示这双筷子的两只),这两个人只有各自获A、B这两只筷子的候才能成功吃饭。可以想象,他们会产生冲突。尝试说明他们可能产生哪些冲突?怎么解决这些冲突?
可能产生的冲突:
- 争抢筷子冲突:两个人都想要先拿到筷子开始吃饭,可能会同时去抓取筷子 A 或者筷子 B,导致出现竞争情况,比如一个人刚抓住筷子 A,另一个人也同时抓住了筷子 A,然后双方僵持不下,谁也没办法拿到完整的一双筷子去吃饭。
- 死锁冲突:假设甲先拿到了筷子 A,乙先拿到了筷子 B,然后甲等着乙放下筷子 B 来拿它,而乙等着甲放下筷子 A 来拿它,这样双方都拿着对方需要的资源(筷子)僵持着,都无法成功吃饭,陷入死锁状态,程序如果出现类似这种资源互等的情况就无法继续推进任务执行了。
解决冲突的办法:
资源分配有序化:可以规定一个拿筷子的顺序,比如甲先拿筷子 A,乙再拿筷子 B,然后甲拿筷子 B,乙拿筷子A,按照固定顺序去获取资源,避免同时争抢的混乱情况和死锁问题。
引入协调机制:例如设置一个中间协调者(类似操作系统中的资源调度器等角色),两个人要拿筷子吃饭时先向协调者申请,协调者根据当前筷子的使用情况合理分配,避免出现冲突情况。如果发现可能导致死锁的资源占用模式,协调者可以进行干预,让一方先释放已经拿到的筷子,重新按照合理顺序获取筷子来吃饭。