《程序设计与数据结构》第6周学习总结

20162308 2016-2017-2 《程序设计与数据结构》第6周学习总结

教材学习内容总结

  1. 类的继承
  2. 代码复用
  3. 抽象类 abstract
  4. 方法重载 Override
  5. 多线程 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)来减慢速度。

代码托管

  • 代码提交过程 & 代码量截图:
  • 2017-04-07 (2).png

上周考试错题总结

没有考试

结对及互评

张师瑜的博客注意学习方法,书上的代码关键是理解,理解了再根据书上的思路,自己敲一遍。

其他(感悟、思考等,可选)

  • 关于代码复用
  • 代码复用是一件能够很大的提高生产力的工作,通过梳理程序的逻辑结构,建立清晰合理的面对对象模型,实现接口或继承抽象类,来实现需求。也就是说,不要重复造轮子。利用已有的代码,应用到当前的需求中,提高效率。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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小时

参考资料

posted @ 2017-04-09 21:32  20162308马平川  阅读(233)  评论(12编辑  收藏  举报