第12周 预习、实验与作业:Java并发编程
目录
1. 预习
简易预习流程:先完成预习课件。然后思考如下课前问题列表中的问题。注意:可根据需要观看线上课程视频。
1.1 学习目标
- 理解进程、线程、临界资源、同步访问等基本概念。掌握Thread、Runnable、syncrhonized的使用,理解线程的生命周期。
- 理解Java并发编程的线程互斥与线程同步问题。能编写基本的互斥与同步代码。
- 了解线程池和Java并发编程的一些辅助工具类。
1.2 预习任务
预习课件(两份)。
1.3 课前问题列表
- 以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?
- 早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序的指令吗?如果不能,为什么我们可以边写程序边听歌?
- 打开“资源监视器”观察你使用的QQ、浏览器或者WPS,一般有几个线程?思考一下,当你运行这些程序的时候,有哪些现象证明了这些程序使用了多个线程?
- 运行移动中的小球中的“Bounce”与"BounceThread"。当你多次点击Start时,两个程序运行起来有何不同?为什么?
- 思考:两个人只有一双筷子(用A、B分别表示这双筷子的两只),这两个人只有各自获A、B这两只筷子的候才能成功吃饭。可以想象,他们会产生冲突。尝试说明他们可能产生哪些冲突?怎么解决这些冲突?
2.实验
- 实验链接:https://www.cnblogs.com/zhrb/p/6762488.html
- PTA题集:多线程。
- 提前完成PTA题集中6-1至6-4中至少两题,可联系老师加分。
3.课后任务(作业)
本周作业主要以完成实验内容为主。
3.1 PTA编程
PTA题集:多线程"中的程序填空题与函数题6-1至6-6。
3.2 在线学习平台
限时完成:章节测验8(文件与流)
3.3 课后
- 使用多线程改造你的面向对象大作业。比如,可以允许两个以上的人使用同一个账号操作同一个购物车进行添加、删除等操作,在这里临界资源是什么。类似:某些餐厅的微信扫码点餐允许多个人同时点菜。
- 课程设计初步选题
- 本次面向对象综合程序设计实践可选择Python或者Java。选择Python的可联系Python课程老师获取题目。
- 历年师兄师姐的作品Java课程设计(2023版)
- 前期任务:可先进行预组队,然后尝试选题(建议可在AI的帮助下进行选题)。建议完成一些实用性较强、可以利用第三方库或者第三方平台API的任务。
3.4 本章参考代码索引
参考代码详见群文件。
并发编程基础参考代码:
| 说明 | 代码 |
|---|---|
| 继承自Thread实现多线程 | FirstThread.java |
| main线程线程 | HelloWorldMainThread.java |
| 实现Runnable接口实现多线程 | FirstRunnable.java |
| 使用匿名类、Lambda表达式简化多线程编写 | ThreadTest.java |
| 任务与线程相分离 | AddTask.java |
| 演示sleep、yield与join方法 | SleepYieldJoinTest.java |
| 使用interrupt方法中断线程 | InterruptTest |
| 使用标志位中断线程 | ThreadStopTest.java |
| 守护线程 | DaemonTest.java |
| 未使用互斥导致线程冲突 | UnSynchronizedThreadTest.java |
| 使用syncrhonized修饰方法解决线程冲突问题 | testSync/SynchronizedThreadTest.java |
并发编程进阶参考代码:
| 项目 | 文件名 |
|---|---|
| 使用原子变量解决 | testSync/SynchronizedThreadAtomicTest.java |
| synchronized语句块解决细粒度同步问题 | testSync/SyncPairCounter.java |
| volatile关键字 | testSync/VolatileTest.java |
| 死锁演示 | testSync/ChopStickDeadLock.java |
| 生产消费者1-未解决 | ProducerConsumerV1.java |
| 生产消费者2-使用while与wait、notify解决同步问题 | ProducerConsumerV2.java |
| Lock对象演示 | testSync/SyncCounterWithLock.java |
| 使用Lock解决死锁 | testSync/ChopStickWithLock.java |
| 使用Lock与Condition解决同步问题 | testSync/ProducerConsumerWithLock.java |
| Executor与ExecutorService:使用执行器与线程池 | ExecutorServiceTest.java |
| Callable:有返回值的任务 | CallableTest.java |
| ForkJoinPool:分而治之 | threadTest/FindInArrTask.java、FindMaxTask、ExecutorServiceTest.java中的testForkJoinPoolTest |
| CountDownLatch:同步辅助类 | testSync/CountDownLatchTest.java |
| BlockingQueue:阻塞队列 | testSync/ProducerConsumerBlockingQueue.java |
| Process与ProcessBuilder:控制进程 | ProcessTest.java |
拓展
询问AI:给我一个简单的Java使用执行器与线程池的示例。并说明和直接使用Thread相比,其优点如何?

浙公网安备 33010602011771号