1. 本周学习总结
2. 书面作业
1. 源代码阅读:多线程程序BounceThread
1.1 BallRunnable类有什么用?为什么代码中需要调用Thread.sleep进行休眠?
BallRunnable类实现Runnable接口,支持多线程;调用Thread.sleep进行休眠则在规定时间内不参与参与到CPU竞争,让线程休眠就可以看到小球的运动轨迹,如果时间为0即Thread.Sleep(0),就触发操作系统立刻重新进行一次CPU竞争就看不见轨迹。
1.2 Ball.java只做了两件事,这两件事分别是什么?BallComponent对象是干什么的?其内部的ArrayList有什么用?程序运行过程中,生成了几个BallComponent对象?该程序使用了多线程技术,每个小球是分别在不同的线程中进行绘制吗?
- 实现小球的移动方法;获得小球的坐标和大小
- BallComponent对象的作用是添加小球和画出小球
- ArrayList用于存放小球
- 运行中生成了一个BallComponent对象
是的每个小球是分别在不同的线程中进行绘制
2. 实验总结:题集(多线程)
2.1 题目:6-1(Thread)、6-3(Runnable-匿名内部类)。回答:a)通过定义Runnable接口的实现类来实现多线程,比继承自Thread类实现多线程有何好处?b) 6-1,6-3,6-11实验总结。
定义Runniable接口比继承Thread类实现多线程的好处:- 适合多个相同代码的线程去处理同一个资源的情况
- 可以避免由于java的单继承特性带来的局限
增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
6-1实验总结:
创建MyThread类对象时指定循环次数n,再创建一个输出从0到n-1的整数的任务即可。
6-3实验总结:
创建代表任务的Runnable实现类的对象,在任务里面写要求的三行输出。
6-11实验总结:
这个题与6-1相似,就是要多实现一个Runnable接口。
2.2 使用Lambda表达式改写6-3
改写如下:
Thread t1 new Thread (( ) - >{System.out.println(mainThreadName);System.out.println(Thread.currentThread().getName());System.out.println(Arrays.toString(getClass().getInterfaces()));});
2.3 题目:6-2(Runnable与停止线程)。回答:a)需要怎样才能正确地停止一个运行中的线程?b)6-2实验总结。
a)不能使用stop()!!!stop()方法已经被废弃;可以使用共享变量的方式,共享变量可以被多个执行相同任务的线程用来作为是否中断的信号,通知中断线程的执行;也可以使用interrupt方法终止线程,这种方法用于线程阻塞时终止线程。
b)public void stopMe();和public void sendWord(String word)方法就编写语句flag = true;
和this.word = word;
就可以实现,主要是run()方法,对word包含alien按格式进行输出,要注意加入while(!flag)
语句来判断程序的执行或终止。
3. 互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)
4. 互斥访问与同步访问
完成题集6-4(互斥访问)与6-5(同步访问)
4.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法可以使用synchronized实现互斥同步访问,使用代码说明(请出现相关代码及学号)?
public static void addId() {synchronized (Counter.class) {id++;}
}
用synchronized的同步代码块实现互斥同步访问
4.2 同步代码块与同步方法有何区别?
同步代码块 :
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
方法如下:
synchronized(object){ }
同步方法 :
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,
内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
方法:
public synchronized void save(){}
4.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
原理:对象锁,在程序中,每个对象都有一把锁,只有获得了对象锁,才能执行相应的synchronized代码块或者方法,共享资源在一个时间段内只允许一个线程访问,访问完了另一个线程才能访问,运用synchronized关键字代码如下;
class Counter {private static int id = 0;public synchronized static void addId() {id++;}public synchronized static void subtractId() {id--;}public static int getId() {return id;}
}
某一线程竞争获得对象锁,其余线程在等待池中等待线程释放对象锁,当线程释放对象锁其余线程又开始竞争对象锁,直到程序结束
4.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?
使用wait ()、notify()、notifyAll()关键字实现线程之间的通信
5. 线程间的合作:生产者消费者问题
5.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
两次放入取出相同,但结果却不一样;因为producer和consumer的存取速度不一致,线程之间没有合作就会产生错乱
5.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)
6. 面向对象设计作业-图书馆管理系统
6.1 系统的功能模块表格,表格中体现出每个模块的负责人。
6.2 运行视频
6.3 讲解自己负责的模块,并粘贴自己负责模块的关键代码(出现学号及姓名)。
3.码云及PTA
3.1. 码云代码提交记录
3.2 截图"多线程"PTA提交列表
3.3 统计本周完成的代码量
周数 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
第一周 | 39 | 39 | 9 | 9 |
第二周 | 278 | 239 | 18 | 9 |
第三周 | 431 | 153 | 33 | 15 |
第四周 | 894 | 182 | 51 | 9 |
第五周 | 1154 | 260 | 67 | 16 |
第六周 | 1354 | 200 | 79 | 12 |
第七周 | 1463 | 109 | 85 | 6 |
第八周 | 1776 | 313 | 101 | 16 |
第九周 | 1903 | 127 | 106 | 5 |
第十周 | 2136 | 233 | 122 | 16 |
第十一周 | 2861 | 725 | 146 | 24 |