• 第十周Java学习总结


    一.知识点摘要

    1.进程与线程

    进程:程序的一次动态执行过程中,从代码加载、执行至执行完毕的一个完整过程。
    线程:一个进程在执行中,可以产生多个执行线索,每条线索也有产生、存在和消亡的过程。

    2.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之间。

    3.Thread类与线程的创建

    可以使用Thread类或者子类创建线程对象,注意子类必须重写run()方法,同时子类可以增加新的成员变量、方法使线程有具体的功能。
    目标对象与线程的关系
    目标对象和线程完全解耦。目标对象没有组合线程对象.目标对象经常需要通过获得线程的名字(因为无法获得线程对象的引用)以便确定是哪个线程正在占用CPU资源,即被JVM正在执行的线程。
    目标对象组合线程(弱耦合)。目标对象可以组合线程.目标对象类组合线程对象时, 目标对象可以通过获得线程对象的引用。

    4.线程的常用方法

    ①start()方法:只有新创建的线程才可以调用该方法。
    ②run()方法:该方法是否运行结束是判断线程是否结束的一个重要标准。只有当该方法运行结束后,线程才能再次调用start()方法。
    ③sleep(int millsecond)方法:线程可以调用该方法来使程序进入睡眠,知道过了参数指定的秒数过后才“醒来”。该方法必须在try-catch语句中调用,因为线程如果在休眠中被打断,会抛出InterruptedException异常。
    ④isAlive()方法:该方法用来判断线程是否正在运行,若是,返回true,若不是,返回false。注意,一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体。
    ⑤currentThread()方法是Thread类中的类方法,返回当前使用CPU的线程。
    ⑥interrupt()方法用来“唤醒”调用sleep方法而处于睡眠状态的线程。

    5.线程同步

    如果有若干个线程需要同时使用一个方法,为了不出现混乱,可以使用synchronized进行修饰。这样一来,该方法只能轮流被调用,直到正在调用该方法的线程使用完该方法后,其他线程才可以调用该方法。

    6.协调同步的线程

    wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。
    notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。
    notify()方法只是通知处于等待中的线程的某一个结束等待。

    7.线程联合

    线程A在其运行期间,如果其他线程B调用了join()方法和线程A联合,那么A线程会立马中断,直到B线程运行结束A线程才会重新排队。若B线程已经结束,调用join()方法则不会有任何效果。

    8.GUI线程

    Java包含GUI(图形用户界面)时,会启动多个线程。

    二.部分例题运行截图

    Example12-3.java

    Example12-6.java

    Example12-9.java

    Example12-11.java

    Example12-13.java

    三. 学习中遇到的困难和解决方法

    一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待

    四.代码托管

    五.码云链接

    https://gitee.com/WZL-DM/BESTI.java.is.20175131

    六.学习进度条
    | 代码行数(新增/累积) | 博客量 |(新增/累积) | 学习时间(新增/累积) | 重要成长 |
    | 目标 | 5000行 | 30篇 | 400小时 |
    | 第一周 | 68/70 | 0/2 | 20/20 | Linux系统基本入门|
    | 第二周 | 267/400 | 1/2 | 15/20 | 基本语法的使用 |
    | 第三周 | 760/800 | 1/2 | 12/15 | 包的使用 |
    | 第四周 | 174/1000 | 1/2 | 15/25 | 继承以及子类与父类 |
    | 第五周 | 307/1576 | 2/2 | 12/20 | 接口|
    | 第六周 | 949/1934 | 3/2 | 14/20 | 内部类与异常类,I/O|
    | 第七周 | 1651/3669 | 2/2 | 12/20 | String类等 |
    | 第八周 | 1108/4598 | 2/2 | 10/20 | 泛型 |
    | 第九周 | 1108/4598 | 2/2 | 12/21 | MySQL |
    | 第十周 | 770/5435 | 1/2 | 10/21 | 线程 |

  • 相关阅读:
    什么是X86和X86-64
    PyQt 5 的学习引言
    GraphQL实战篇(一)
    GraphQL基础篇
    .net之设计模式
    .net面向对象设计原则
    Entity Framework (EF) Core工具创建一对多和多对多的关系
    NLog组件
    给dao层注入jdbcTemplate时的一个强行bug(jdbcDaoSupport不要随便用!用了要记得!)
    使用工厂模式解耦和IoC思想
  • 原文地址:https://www.cnblogs.com/WZL-DM/p/10810241.html
Copyright © 2020-2023  润新知