20175310 《Java程序设计》第10周学习总结

20175310 《Java程序设计》第10周学习总结

本周博客:
2018-2019-2 20175310 实验三《敏捷开发与XP实践》实验报告

教材学习内容总结

这周学习了第十二章的内容,主要的知识点如下:

进程与线程

进程与线程的关系:

  • 进程是程序的一次动态执行进程,它对应了从代码加载、执行至执行完毕的一个完整过程
  • 线程不是进程,一个进程在其执行过程中,会产生多个线程,线程间可以共享进程中的代码和数据。
  • 没有进程就没有线程

Java中的线程

多线程:

  • 多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。
  • 计算机只能执行多个线程中的一个,java虚拟机快速的把控制从一个线程切换至另一个线程。
  • JVM一直要等到java应用程序中的所有线程都结束,才结束java应用程序

主线程(main线程)

  • 每个Java应用程序都有一个缺省的主线程。
  • 当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。
  • JVM一直要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序 。

线程的状态与生命周期

  • 新建:当一个Thread类或者其子类的对象被声明并创建时,线程对象处于新建状态,有了相应的内存空间和其他资源
  • 运行:调用start()方法进行排队,调用run()方法立刻执行
  • 死亡:一个正常运行的线程正常完成了他的全部工作或者被提前强制性终止、

Thread类与线程的创建

  • 编写Thread类的子类时,需要重写run()方法
  • Thread创建线程通常使用构造方法:Thread(Runnable target)

线程的常用方法

  • start()
  • run()
  • sleep(int millsecond)参数millsecond是以毫秒为单位的休眠时间,如果线程在休眠时被打断,JVM就会抛出InterruptedException异常
  • isAlive()返回true或者false
  • currentThread()Thread类中的类方法,可以用类名调用
  • interrupt()吵醒休眠的线程

线程同步

  • 线程同步:若干个线程都需要使用一个synchronized方法
  • 线程同步机制:当一个线程A使用同步方法时,其他线程想使用这个同步方法时就必须等待

线程联合

  • 计时器线程Timer(int a,Object b)创建一个计时器
  • 守护线程thread.setDaemon(true)可以将自己设置成一个守护线程

学习中的问题和解决过程

  • 问题1:
    在做数据结构-排序(选做)作业时,编译出现错误

  • 问题1解决方案:
    检查时发现类sortTotalScore和类sortID的框架结构都是一样的,一个是按总成绩排序,还有一个是按学号排序,返回值也都是一样的。可是只有类sortID的返回值报错了,而类sortTotalScore却没有报错。仔细检查后发现,我已开始把学号ID定义成了String类型,而不是int型,因此返回值语句:return (int)(a.getId() - b.getId());肯定会报错,因为String类型的数据不能做减法。

  • 问题2:
    按学号排序的输出结果中,总成绩那一项所有人都是0.0而不是三门课程成绩之和。

  • 问题2解决方案:
    我的代码没有修改之前是这样,上面一段是按学号排序,下面一段是按总成绩排序。

 sortID b = new sortID();
        Collections.sort(list,b);
        System.out.println("学号排序:");
        for (Student student : list) {
            System.out.println(student);
        }

        sortTotalScore a = new sortTotalScore();
        Collections.sort(list, a);
        System.out.println("成绩排序:");
        for (Student student : list) {
            System.out.println(student);
        }

可以发现,问题出现在了由于总成绩的计算是在按成绩排序类中的,而我没有先对所有成员进行按总成绩排序,先按学号排序了,所以此时总成绩还没算,因此每位同学的总成绩都显示为0,只需将按总成绩排序的语句提前即可。
修改后的代码如下:

sortTotalScore a = new sortTotalScore();
        Collections.sort(list,a);

        sortID b = new sortID();
        Collections.sort(list,b);
        System.out.println("学号排序:");
        for (Student student : list) {
            System.out.println(student);
        }


        Collections.sort(list, a);
        System.out.println("成绩排序:");
        for (Student student : list) {
            System.out.println(student);
        }

代码托管

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 6/6 2/2 30/30
第二周 625/631 3/5 35/65
第三周 660/1291 2/7 38/103
第四周 972/2263 2/9 30/133
第五周 399/2662 3/12 32/165
第六周 1342/4004 3/15 35/200
第七周 1341/5345 2/17 35/235
第八周 798/6143 2/19 35/270
第九周 1779/7922 2/21 30/300
第十周 1092/9014 2/23 40/340
原文地址:https://www.cnblogs.com/xicyannn/p/10800902.html