20165318 2017-2018-2 《Java程序设计》第八周学习总结

目录

学习过程遇到的问题及总结

  • Q1:在运行课本代码12_1时,结果如下:与课本上运行结果并不相同,再运行一次后发现,与上次结果竟然也不一样。

  • 解决过程:在仔细看书后发现,书上解释说,“该程序在不同的计算机运行或在同一台计算机反复运行的结果不尽相同,输出结果依赖当前CPU资源的使用情况”。

  • Q2:在本周的课堂测试中,我在编写“计算寿命最长和最短国家”的时候,输出结果中寿命最长的国家是正确的,但是寿命最短的国家却一直不对:

  • 解决过程:经过反复纠正,我发现在有以下几处错误:

    • 没有去掉寿命记录为空,即寿命为0的国家;
    • 将计算寿命最长和寿命最短的国家放到了两个循环中,导致在计算寿命最长的国家时,已经读到数据库的底端了。
    • 将agemin赋值为0,导致数据库中没有寿命比0小的国家,将agemax赋值为100,没有发现寿命比100大的国家。
      以下是正确的结果:

返回目录

教材学习内容总结

第12章 Java多线程机制

12.1进程与进程

  • 程序是一段静态的代码,进程是程序的一次动态执行过程,这个过程也是进程本身从产生、发展至消亡的过程。

  • 线程不是进程,是比进程更小的执行单位。但与进程不同的是,线程的中断和恢复可以更加节省系统的开销。

  • 没有进程就没有线程。

12.2Java中的线程

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

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

  • 计算机在任何给定的时刻只能执行线程中的一个。Java虚拟机快速地把控制从一个线程切换到另一个线程,这些线程被轮流执行,使得每个线程都有机会使用CPU资源。

2、主线程(main线程)
  • 主线程(main线程)负责执行main方法。

  • 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,即main方法返回时,JVM就会结束Java应用程序。如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证,每个线程都有机会使用CPU,main方法即使执行完最后的语句(主线程结束),JVM也不会结束Java应用程序,JVM一直要等到Java应用程序都结束之后,才结束Java应用程序。

3、线程的状态和生命周期

Java语言使用Thread类及其子类的对象来表示线程。

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

  • 新建:一个Thread类或其子类的对象被声明并创建,已经有了相应的内存空间和其他资源。

  • 运行:JVM将CPU使用权切换给该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期了。
    如果线程是Thread的子类创建的,该类中的run()方法就立刻执行,且程序必须在子类中重写父类的run()方法。
    在线程没有结束run()方法之前,不要让线程再调用start()方法,否则将发生IllegalThreadStateException异常。

  • 中断:有四种原因的中断
    • JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
    • 线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。
    • 执行了wait()方法,使得当前线程进入等待状态,必须由其他线程调用notify()方法通知它,使得它重新进到线程队列中排队等待CPU资源。
    • 执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。只有当引起阻塞的原因消除时,线程才重新进到线程队列中排队等待CPU资源。
  • 死亡:不具有继续运行的能力。实质是线程释放了实体,即释放分配给线程对象的内存。
    • 死亡原因之一是执行完run()方法中的全部语句,结束了run()方法;
    • 死亡原因之二是强制run()方法结束。
4、线程调度与优先级
  • 每个Java线程的优先级都在常数1和10之间,即Thread.MIN_PRIORITYThread.MAX_PRIORITY之间。如果没有明确地设置线程的优先级别,,每个线程的优先级都为常数5,即Thread.NORM_PRIORITY

  • 可以通过setPriority(int grade)方法调整优先级, getPriority 方法返回线程的优先级。

  • 当线程使用CPU资源的时间到时后,即使线程没有完成自己的全部操作,JVM也会中断当前线程的执行,把CPU的使用权切换给下一个排队等待的线程,当前线程将等待CPU资源的下一次轮回,然后从中断处继续执行。

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

12.3Thread类与线程的创建

1、使用Thread的子类
  • 在编写Thread类的子类时,需要重写父类的run()方法。

  • 优点:可以在子类中增加新的成员变量,实现城具有某种属性,也可以在子类中新增加方法,使线程具有某种功能。

  • Java不支持多继承,Thread类的子类不能再扩展其他的类。

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

  • 对于使用同一目标对象的线程,目标对象的成员变量自然就是这些线程共享的数据单元,使用Runnable接口比使用Thread的子类更具有灵活性。

3、目标对象与线程的关系
  • 目标对象和线程完全解耦:目标对象经常需要通过获得线程的名字(因为无法获得线程对象的引用)以便确定被JVM正在执行的线程是哪个。

  • 目标对象组合线程(弱耦合):目标对象可以组合线程,目标对象类组合线程对象时,目标对象可以通过获得线程对象的引用。

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

12.4线程的常用方法

  • start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。

  • run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。

  • sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。

  • isAlive(): 线程处于“新建”状态时,线程调用isAlive()方法返回false。在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。

  • currentThread():
    该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。

  • interrupt():
    一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。

12.5线程同步

  • 多个线程调用synchronized方法必须遵守同步机制。

  • 在处理线程同步时,要做的第一件事就是要把修改数据的方法用关键字synchronized来修饰。

  • 所谓线程同步就是若干个线程都需要使用一个synchronized修饰的方法。

  • 线程同步机制:当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到线程A使用完该synchronized方法。

12.6协调同步的线程

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

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

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

  • wait()notify()notifyAll()都是Object类中的final方法,被所有的类继承且不允许重写得方法。不可以在非同步方法中使用wait()notify()notifyAll()

12.7线程联合

  • 一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:
    B.join();
    称A在运行期间联合了B。如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那么B.join()不会产生任何效果。

12.8GUI线程

  • 当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序会自动
    启动更多的线程

  • 两个重要的线程
    • AWT-EventQuecue:负责处理GUI事件
    • AWT-Windows:负责将窗体或组件绘制到桌面

12.9计时器线程

  • 使用Timer类的方法start()启动计时器,即启动线程。

  • 使用Timer类的方法stop()停止计时器,即挂起线程。

  • 使用restart()重新启动计时器,即恢复线程。

  • 使用Timer(int a,Object b)创建一个计时器,计时器每隔a毫秒“震铃”一次,参数b是计时器的监视器。计时器发生的震铃事件是ActinEvent类型事件。当震铃事件发生时,监视器就会监视到这个事件,监视器就回调ActionListener接口中的actionPerformed(ActionEvent e)方法。

  • 注:计时器的监视器必须是组件类(例如JFrameJButton等)的子类的实例,否则计时器无法启动。

12.10守护线程

  • 线程默认是非守护线程(即用户(user)线程)。

  • 一个线程调用void setDaemon(boolean on)方法可以将自己设置成一个守护(Daemon)线程,例如:thread.setDaemon(true);

  • 当程序中的所有用户线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程也立刻结束运行。

  • 用户线程与守护线程的区别在于虚拟机的离开。如果用户线程已经全部退出运行,只剩下守护线程存在,那么虚拟机也就退出了。

  • 一个线程必须在运行前设置自己是否是守护线程。

返回目录

代码托管

码云链接

代码统计

返回目录

20165318 2017-2018-2 《Java程序设计》第八周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第八周学习总结

    1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...

  2. 20165318 2017-2018-2 《Java程序设计》第九周学习总结

    20165318 2017-2018-2 <Java程序设计>第九周学习总结 目录 学习过程遇到的问题及总结 教材学习内容总结 第13章 Java网络编程 代码托管 代码统计 学习过程遇到 ...

  3. 20165318 2017-2018-2 《Java程序设计》第二周学习总结

    20165318 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习了第二章和第三章的内容,掌握了Java中基本数据类型.数组.运算符.表达式和语句等方 ...

  4. 20165318 2017-2018-2 《Java程序设计》第一周学习总结

    20165318 2017-2018-2 <Java程序设计>第一周学习总结 教材内容学习总结 第一章主要对Java平台进行了简单的介绍,并讲解了如何搭建Java环境. Java平台概论 ...

  5. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  6. 201871010106-丁宣元 《面向对象程序设计(java)》第八周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第八周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...

  7. 学号 20175212 《Java程序设计》第九周学习总结

    学号 20175212 <Java程序设计>第九周学习总结 教材学习内容总结 一.MySQL数据库管理系统 1.在官网上下载并安装MySQL 2.在IDEA中输入测试代码Connectio ...

  8. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  9. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  10. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

随机推荐

  1. MyEclipse中快速跳转到指定行号位置

    有时候我们希望能从当前编辑位置跳到指定行号的位置,可以使用Ctrl + l 快捷键. 其中 l 代表line.

  2. java自学-运算符

    上一篇介绍了java的变量和数据类型,要对数据处理,还需要用到java运算符,这里只总结下常用的,运算符主要分为以下几类:1 算数运算符 算数运算符包括: + 加法运算 - 减法运算 * 乘法运算 / ...

  3. javascript代码

    LazyMan 实现LazyMan(什么是LazyMan?请自行google) function _LazyMan(_name) { var _this = this; _this.tasks = [ ...

  4. css伪类和伪元素的区别,:before和::before的区别

    伪类用于选择DOM树之外的信息,或是不能用简单选择器进行表示的信息.前者包含那些匹配指定状态的元素,比如:visited,:active:后者包含那些满足一定逻辑条件的DOM树中的元素,比如:firs ...

  5. Angular面试题四

    二十.angular 的缺点有哪些? 1.强约束 导致学习成本较高,对前端不友好. 但遵守 AngularJS 的约定时,生产力会很高,对 Java 程序员友好. 2.不利于 SEO 因为所有内容都是 ...

  6. 【node】用koa搭建一个增删改服务(一)

    前文,vue分类里有一个日志demo的练习,这篇文章就是介绍针对日志demo的服务是怎么写的 一.koa搭建项目 1. npm init 2. npm install koa 二.建数据库 下面是项目 ...

  7. CCSUOJ评测系统——第二次scrum冲刺

    1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 2.第二次冲刺任务安排 对HUSTOJ数据库进行分析 序号 表名 作用 备注 1 compileinfo 记录编译错误的记录 2 contest ...

  8. 在Mac上用bootcamp安装windows,使用Android studio启动模拟器时蓝屏问题的解决方法

    原链接 https://medium.com/@andrea.bresolin/windows-10-on-mac-with-boot-camp-making-intel-haxm-work-with ...

  9. c# 线程池:开启10个线程运行Fibonacci,并在所有线程运行完后,得出结果。

    namespace CAThreadPool { class ThreadpoolDemo6 { static void Main(string[] args) { ; // One event is ...

  10. 几个很好用SQL语法(SqlServer)

    1,MERGE INTO 语句: 这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE,作用还是很强大的(简单的说就是它可以批量更新和插入处理一个数据集,如果存在就更新 ...