zoukankan      html  css  js  c++  java
  • 20175202 《Java程序设计》第十周学习总结

    第十二章 Java多线程机制

    一、教材内容总结:

    1.操作系统与进程

    进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。

    现代操作系统可以同时管理一个计算机系统中的多个进程,即可以让计算机系统中的多个进程轮流使用CPU资源。

    2.进程与线程

    线程不是进程,但其行为很像进程。

    线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程。

    线程的中断与恢复可以更加节省系统的开销。

    3.Java的多线程机制

    Java语言的一大特性点就是内置对多线程的支持。

    多线程是指在一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。

    Java虚拟机快速地把控制从一个线程切换到另一个线程。这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。

    4.主线程(main线程)

    每个Java应用程序都有一个缺省的主线程。

    当JVM(Java Virtual Machine 虚拟机)加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法。

    如果不使用多线程技术,是无法解决在一个Java应用程序中出现2个以上的无限循环的问题。

    5.线程的状态与生命周期

    新建的线程在它的一个完整的生命周期中通常要经历如下的4种状态:

    1.新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。

    2.运行 :线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立

    开始自己的生命周期了。

    3.中断:有4种原因的中断:

    • JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
    • 线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。
    • 线程使用CPU资源期间,执行了wait()方法。
    • 线程使用CPU资源期间,执行某个操作进入阻塞状态。

    4.死亡 :处于死亡状态的线程不具有继续运行的能力。线程释放了实体。

    6.线程调度与优先级

    1.处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别

    用Thread类中的类常量表示。

    2.Java调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。

    7.使用Thread的子类

    在Java语言中,用Thread类或子类创建线程对象。

    在编写Thread类的子类时,需要重写父类的run()方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run()方法中没有任何操作语句。

    8.使用Thread类

    创建线程的另一个途径就是用Thread类直接创建线程对象。使用Thread创建线程通常使用的构造方法是:

    Thread(Runnable target)(该构造方法中的参数是一个Runnable类型的接口。)

    在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象,当线程调用start()方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用

    接口中的run()方法(接口回调)。

    9.目标对象与线程的关系

    从对象和对象之间的关系角度上看,目标对象和线程的关系有以下两种情景。

    • 1.目标对象和线程完全解耦
    • 2.目标对象组合线程(弱耦合)

    10.关于run方法启动的次数

    对于具有相同目标对象的线程,当其中一个线程享用CPU资源时,目标对象自动调用接口中的run方法,这时,run方法中的局部变量被分配内存空间,当轮到另一个线程享用CPU资源时,目标对象会再次调用接口中的run方法,那么,run()方法中的局部变量会再次分配内存空间。也就是说run()方法已经启动运行了两次,分别运行在不同的线程中,即运行在不同的时间片内。

    11.线程的常用方法

    • 1.start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。
    • 2.run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。
    • 3.sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。
    • 4.isAlive(): 线程处于“新建”状态时,线程调用isAlive()方法返回false。在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。
    • 5.currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
    • 6.interrupt() :一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。

    12.线程同步

    在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理。
    在处理线程同步时,要做的第一件事就是要把修改数据的方法用关键字synchronized来修饰。
    所谓线程同步就是若干个线程都需要使用一个synchronized修饰的方法。

    13.协调同步的线程

    wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。

    notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。

    notify()方法只是通知处于等待中的线程的某一个结束等待。

    14.线程联合

    一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:B.join(); 称A在运行期间联合了B。

    如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那

    么B.join()不会产生任何效果。

    15.GUI线程

    当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和AWT-Windows。

    AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程负责将窗体或组件绘制到桌面。

    JVM要保证各个线程都有使用CPU资源的机会,比如,程序中发生GUI界面事件时,JVM就会将CPU资源切换给AWT-EventQuecue线程,AWT-EventQuecue线程就会来处理这个事件,比如,你单击了

    程序中的按钮,触发ActionEvent事件,AWT-EventQuecue线程就立刻排队等候执行处理事件的代码.

    16.计时器线程

    计时器每隔a 毫秒“震铃”一次,参数b是计时器的监视器。

    计时器发生的震铃事件是ActinEvent类型事件。

    当震铃事件发生时,监视器就会监视到这个事件,监视器就回调ActionListener接口中的actionPerformed(ActionEvent e)方法。

    使用Timer类的方法start()启动计时器,即启动线程。使用Timer类的方法stop()停止计时器,即挂起线程,使用restart()重新启动计时器,即恢复线程 .

    二、学习过程中遇到的问题

    1.IDEA无法正确执行Example12_1,出现执行完主进程再执行其他进程的问题

    解决:从新启动IDEA输入代码,正确执行了Example12_1。

    三、码云链接

    https://gitee.com/GeXuYang/1059724060

    四、上周考试错题总结

    1.下列属于常用数据库的是

    A.Access

    B.XAMMP

    C.MySQL

    D.Oracle

    E.SQL Server

    所选答案:CE

    正确答案:   ACDE

    五、总结与体会

           通过第十周的学习,利用教材以及通过优秀同学上传的学习博客,自己充分学习了第12章的内容,但对这章的大部分的学习内容并不是十分理解,还有部分内容没能进行全面学习,但通过学习12章内容,自己的在Java硬知识上的收获非常大,这会使得编程更加便捷。总之,这章的学习内容非常困难,需要再花更多的时间来查漏补缺。

  • 相关阅读:
    每日一水 POJ8道水题
    编译和使用 MySQL C++ Connector
    j2ee model1模型完成分页逻辑的实现 详解!
    DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号
    指向结构体变量的指针
    EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
    MybatisGen1.0 Mybatis JavaBean Mapper生成工具
    The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
    资源-Android:Android
    软件-开发软件:Android Studio
  • 原文地址:https://www.cnblogs.com/gexvyang/p/10816403.html
Copyright © 2011-2022 走看看