• 20175314 《Java程序设计》第十周学习总结


    20175314 《Java程序设计》第十周学习总结

    教材学习内容总结

    • 进程与线程:一个进程的进行期间可以产生多个线程。
    • Java内置对多线程的支持,计算机只能执行线程中的一个,Java虚拟机只是从一个线程迅速地切换到另一个线程。
      当main方法中有其他线程时,JVM要等到Java应用程序中的所有线程都结束后才会结束Java应用程序。
      Java语言使用Thread类及其子类的对象来表示线程,新建的线程一般要经历4个状态:
      ① 创建Thread对象;
      ② 在第一步创建对象后,该对象仅仅拥有内存次元,需要再调用start()方法才能使得其成为新线程。如果这个线程是Thread类的对象,其中run()方法就立刻执行,且程序必须在子类中重写run()方法。线程没有结束run()方法之前,不能让线程再调用start()方法,否则会抛出IllegalThreadStateException异常。
      ③ 线程中断:切换给其他线程;执行了sleep(int time)方法,经过time毫秒后,该线程就重新排队,以便从中断处继续运行;执行了wait()方法,线程进入等待状态,此时,其他线程调用notify()方法来使得在等待状态的线程重新排队以便从中断处继续运行;执行某个操作进入阻塞状态时不能进入排队队列。
      ④ 线程有两种原因会“死亡”:
      一、正常运行完了该线程的全部工作;
      二、run()方法被强制结束。当一个线程“死亡”之后,未死亡的线程会继续轮流占用CPU。
      线程是可以设置优先级的(使用setPriority()方法),当优先级高的线程执行完毕时,才会执行低优先级的线程。可以使用getPriority()方法来获得线程的优先级,优先级只能在1~10之间。
    • Thread类与线程的创建。
      可以使用Thread类或者子类创建线程对象,子类必须重写run()方法,同时子类可以增加新的成员变量、方法使线程有具体的功能。
      若创建目标对象的列不包含对线程对象的引用,目标对象可以使用String name=Thread.currentThread().getName();来获得当前使用CPU资源的线程名字;若目标对象组合线程,则目标对象可以使用String name=Thread.currentThread();来获得当前使用CPU资源的线程引用。
      线程的进行如果到达指定毫秒数还没有运行完run()方法,那么会先停止,等到睡眠时间结束后再接着运行。
    • 线程的常用方法
      start()方法:只有新创建的线程才可以调用该方法。
      run()方法:该方法是否运行结束是判断线程是否结束的一个重要标准。只有当该方法运行结束后,线程才能再次调用start()方法。
      sleep(int millsecond)方法:线程可以调用该方法来使程序进入睡眠,知道过了参数指定的秒数过后才“醒来”。该方法必须在try-catch语句中调用,因为线程如果在休眠中被打断,会抛出InterruptedException异常。
      isAlive()方法:该方法用来判断线程是否正在运行,若是则返回true,若不是则返回false,一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体。
      currentThread()方法是Thread类中的类方法,返回当前使用CPU的线程。
      interrupt()方法用来“唤醒”调用sleep方法而处于睡眠状态的线程。
    • 线程同步:如果有若干个线程需要同时使用一个方法,为了不出现混乱,可以使用synchronized进行修饰。
    • 协调同步的线程:当一个线程使用的同步方法中用到了某个变量,而此变量又需要其他线程修改后才能符合本线程的要求,则可以使用wait()方法来中断线程的执行,并允许其他线程使用这个同步方法(sleep方法无法做到)。若有线程在运行同步方法时不需要等待,那么需要在用完方法的同时应用notifyAll()方法来通知其他所有处于等待的线程结束等待。只有在同步线程中才可以使用wait(),notify(),notifyAll()方法。
    • 线程联合:线程A在其运行期间,如果其他线程B调用了join()方法和线程A联合,那么A线程会立马中断,直到B线程运行结束A线程才会重新排队。若B线程已经结束,调用join()方法则不会有任何效果。
    • GUI线程:Java包含GUI(图形用户界面)时,会启动多个线程。
    • 计时器线程:Java中的javax.swing包中的Timer类可以用来创建计时器:Timer(int a,Object b);,a为毫秒,b为监视器(监视器必须是组件类),每隔a毫秒会执行b一次。java.util包中也有一个名字是Timer的类。
    • 守护线程:线程默认是非守护线程,线程在运行之前必须设置是否为守护线程。可调用voidsetDaemon(boolean on)来将自己设置成一个守护线程。当所有非守护线程运行结束时,守护线程一定会跟着结束。

    教材学习中的问题和解决过程

    • 线程有新建、运行、中断和死亡四种状态
    • 有4种原因的中断:
      (1)JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态
      (2)线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态
      (3)线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态
      (4)线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞
    • 一个线程执行完run方法后会进入死亡状态,不能再调用start()方法
    • 建立线程有两种方法:用Thread类或其子类
    • 使用setPrority(int grade)方法设置线程优先级
    • Java使我们可以创建多个线程,在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理,否则可能发生混乱
    • 当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待
    • 线程调用interrupt()的作用是“吵醒”休眠的线程。一个占有CPU资源的线程可以让休眠的线程调用interrupt方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源

    代码调试中的问题和解决过程

    • 问题:MySQL无法启动:Can't connect to MySQL server on localhost (10061)
    • 解决方案:以管理员身份运行命令提示符(否则会报Install/Remove of the Service Denied!),输入D:mysqld --installnet start mysql

    代码托管

    本周考试错题

    • 问题:关于 Connection 的描述,何者正确?
      A .可以从 DriverManager 上取得 Connection
      B .可以从 DataSource 上取得 Connection
      C .在方法结束之后 Connection 会自动关闭
      D .Connection 是线程安全( Thread-safe)
    • 理解情况:不会自动关闭,数据多了的话就会堆栈溢出,只能在调用的后边关掉 rs,ps,和con

    心得体会

    Java的多线程合理运用可以为我们编程带来极大的便利,但也需要认真的学习和充分的练习才能够掌握

    学习进度条

    代码行数 博客量 学习时间 重要成长
    目标 5000行 16篇 320小时
    第一周 51/100 1/1 12/20 基本掌握了Linux的简单指令
    第二周 173/200 1/1 18/20 学习了Java重要基本语法
    第三周 672/800 1/1 18/20 学习了包含多个类的Java程序及类的包机制
    第四周 436/600 1/1 12/20 学习程序父类和子类的继承规则
    第五周 573/600 1/1 10/20 学习通过类来实现接口和接口回调
    第六周 1182/1200 1/1 20/20 学习内部类、匿名类、异常类和File类
    第七周 491/600 1/1 14/20 学习了Java的常用实用类
    第八周 1302/1500 4/4 22/25 学习了Java的泛型类和单元测试的方法
    第九周 624/800 3/3 18/20 学习使用MySQL数据库服务器
    第十周 799/800 5/5 20/20 学习应用Java多线程机制
    • 计划学习时间:20小时

    • 实际学习时间:20小时

    参考资料

  • 相关阅读:
    26个精选的JavaScript面试问题
    用js实现随机选取10–100之间的10个数字,存入一个数组,并排序
    小程序布局中class='container'的bug
    PHP接收数据数据包的几个方式
    LINUX命令
    VMware的下载安装
    php中Sessions
    php中Cookies
    php文件上传
    php文件处理
  • 原文地址:https://www.cnblogs.com/SANFENs/p/10809661.html
Copyright © 2020-2023  润新知