20162308 2016-2017-2 《程序设计与数据结构》第6周学习总结
教材学习内容总结
- 类的继承
- 代码复用
- 抽象类 abstract
- 方法重载 Override
- 多线程 Multi-Threading
教材学习中的问题和解决过程
- 1 关于多重继承
- 一致认为,在面对对象中添加多重继承的特性对程序员来说,至少是像我这样没什么经验的初学者来说,是一件非常困难的事。继承应该是一种"is-a"的逻辑,那么多重继承在这个角度上来说就是不合逻辑的。所以,万幸,Java没有在设计的时候引入这个特性。
- 2 线程、进程 (Thread & Process)
- 阅读材料:
线程和进程的区别是什么?
《Java编程思想》 - 去年,好想也是四月初的时候,当时我在杭电面试,当时说到了自己设计的爬虫中实现了 Producer- Consumer 的多线程模型,然后那几个老师就问我线程和进程有什么区别。那个时候,我自己其实也搞不懂线程和进程有什么区别,我就瞎扯了几句。回去以后,自己查了一些资料,也对进程和线程有了一些理解。进程是CPU资源分配的最小单位,线程是依附于进程而存在的调度,一个进程中可以存在多个线程。
利用对象,可将一个程序分割成相互独立的区域。我们通常也需要将一个程序转换成多个独立运行的子任务。像这样的每个子任务都叫作一个“线程”(Thread)。编写程序时,可将每个线程都想象成独立运行,而且都有自己的专用CPU。一些基础机制实际会为我们自动分割CPU的时间。我们通常不必关心这些细节问题,所以多线程的代码编写是相当简便的。 这时理解一些定义对以后的学习狠有帮助。“进程”是指一种“自包容”的运行程序,有自己的地址空间。 “多任务”操作系统能同时运行多个进程(程序)——但实际是由于CPU分时机制的作用,使每个进程都能 循环获得自己的CPU时间片。但由于轮换速度非常快,使得所有程序好象是在“同时”运行一样。“线程” 是进程内部单一的一个顺序控制流。因此,一个进程可能容纳了多个同时执行的线程。 多线程的应用范围很广。但在一般情况下,程序的一些部分同特定的事件或资源联系在一起,同时又不想为 它而暂停程序其他部分的执行。这样一来,就可考虑创建一个线程,令其与那个事件或资源关联到一起,并让它独立于主程序运行。一个很好的例子便是“Quit”或“退出”按钮——我们并不希望在程序的每一部分代码中都轮询这个按钮,同时又希望该按钮能及时地作出响应(使程序看起来似乎经常都在轮询它)。 ——《Think in Java》
//example: using class Thread
//SimpleThread.java
public class SimpleThread extends Thread{
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread(){
System.out.println("Making" + threadNumber);
}
public void run(){
while(true){
System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0)return;
}
}
public static void main(String[] args) {
for(int i = 0; i < 5; i++)new SimpleThread().start();
System.out.println("All Threads Started");
}
}
//example: using interface Runable
//SimpleRunable.java
class MyRunable implements Runnable{
private String name;
MyRunable(String name){
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(name + "+1s");
Thread.sleep(1000);
System.out.println(name + "+2s");
} catch (Exception e) {
System.out.println("Against Basic Law");
}
}
}
public class SimpleRunable{
public static void main(String[] args) {
MyRunable mr1 = new MyRunable("T1");
MyRunable mr2 = new MyRunable("T2");
Thread t1 = new Thread(mr1);
Thread t2 = new Thread(mr2);
t1.start();
t2.start();
}
}
代码调试中的问题和解决过程
- 多线程的程序运行时运行太快,不能观察到顺序。
- 使用Thread.sleep(Math.Random() * 1000)来减慢速度。
代码托管
- 代码提交过程 & 代码量截图:
上周考试错题总结
没有考试
结对及互评
张师瑜的博客注意学习方法,书上的代码关键是理解,理解了再根据书上的思路,自己敲一遍。
其他(感悟、思考等,可选)
- 关于代码复用
- 代码复用是一件能够很大的提高生产力的工作,通过梳理程序的逻辑结构,建立清晰合理的面对对象模型,实现接口或继承抽象类,来实现需求。也就是说,不要重复造轮子。利用已有的代码,应用到当前的需求中,提高效率。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 26/26 | 1/1 | 7/7 | |
第二周 | 81/107 | 1/2 | 8/15 | String类型的使用 |
第三周 | 80/187 | 1/3 | 5/20 | 位运算 |
第四周 | 300/487 | 1/4 | 8/28 | 动态数组和迭代器 |
第五周 | 132/619 | 1/5 | 18/46 | OOP编程导论 |
第六周 | 90/709 | 1/6 | 5/51 | 多线程 |
-
计划学习时间:5小时
-
实际学习时间:8小时