




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CompanyLOGO异常、多线程、垃圾回收异常、多线程、垃圾回收主讲人主讲人:翟佳宇翟佳宇Company Logo主要内容主要内容Java异常处理机制异常处理机制1多线程编程多线程编程2垃圾回收机制垃圾回收机制3Java代码优化编程代码优化编程4Company Logo异常异常v基本概念基本概念 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用等)时,Java就会用异常对象处理。 异常的顶层父类:java.lang.Throwable 参考实例:ShowException.javaCompany Logo异常分类异常分类v异常分类:异常分类: 检查性异常 ja
2、va.lang.Exception (编译异常) 运行期异常 java.lang.RuntimeException 错误: java.lang.Error Company Logo异常分类异常分类v检查性异常检查性异常: 程序正确,但因为外在的环境条件不满足而引发。 例如:用户错误及I/O问题-程序试图打开一个不存在的远程端口或者打开不存在的文件。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序讲不能被编译。 参考实例:略Company Logo异常分类异常分类v运行异常运行异常 程序存在bug 如数组越界,0作为被除数,这类异常一般通过程序来避免,Java编译器强制要求处理这类异
3、常 编译器检测不到这类异常,不会完全排除 参考实例:TypeCheckException.javaCompany Logo异常分类异常分类v错误错误: 一般很少见,也很难通过程序解决。 它可能源于程序的bug,更可能源于环境问题,如内存耗尽,程序中无需处理,而由运行环境处理。 示例:这个没法演示Company Logo异常处理方法异常处理方法v异常处理方法异常处理方法: 处理异常 在可能出现异常的地方直接处理异常 抛出异常 异常抛给函数调用者,让函数调用者去处理异常Company Logo异常处理方法(一)异常处理方法(一)v处理异常处理异常 trycatch finallyCompany L
4、ogo异常处理方法(一)异常处理方法(一)vtrycatch 在出现异常的地方终止执行代码,进入catch语句,如果有多个catch语句则进入匹配异常的catch块中Company Logo异常处理方法(一)异常处理方法(一)vfinally 如果把finally块置于trycatch语句后,finally块一般都会得以执行,相当于一个保障,即使前面的try块发生异常而没有处理对应异常的catch块,finally会马上执行Company Logo异常处理方法(一)异常处理方法(一)v关于关于finally注意注意 以下情况中,finally块将不会被完全执行: finally块中发生异常 程
5、序所在线程死亡 在前面代码中用了System.exit(); 关闭CPUCompany Logo异常处理方法(二)异常处理方法(二)v抛出抛出异常异常 将异常抛给函数调用者,让函数调用者去处理异常 参考实例:ExceptionThrow.javaCompany Logo主要内容主要内容Java异常处理机制异常处理机制1多线程编程多线程编程2垃圾回收机制垃圾回收机制3Java代码优化编程代码优化编程4Company Logo多线程编程多线程编程v线程概念线程概念 线程进程 进程:进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)Company Logo进程进程线程线程计算机内存
6、空间:进程三进程二(eclipse)进程一(eclipse)线程一线程二线程三Company Logo进程进程线程线程Company Logo多线程多线程v线程的创建方法线程的创建方法通过继承Thread类,并重写run函数实现Runnable接口并且重写run函数示例:创建一个线程对象,实现每隔一秒输出helloworld并且在执行指定次后结束Company Logo多线程多线程v为什么提供两种方法?为什么提供两种方法? 因为Java是单继承的,在某些情况下一个类已经继承了某个父类,这是再用继承的方式来创建线程已经不可能了,这样就提出了另外一种方法来创建线程:通过Runnable接口来创建。
7、Company Logo多线程多线程v两种方法的区别两种方法的区别本质上没有区别。但是实现是有所区别: 通过继承Thread类实现Human hu=new Human();/运行start函数后线程进入运行状态(Running)hu.start(); 通过实现Runnable接口实现Human2 hu=new Human2();Thread T=new Thread(hu);T.start();在编写程序时,尽量使用接口实现进程类Company Logo线程的状态关系线程的状态关系创建Runnable(可执行状态)Running(运行状态)Blocked(阻塞状态)Dead(死亡状态)出生可以
8、工作参加工作人生发生意外,失去了工作能力Company Logo多线程多线程v操作线程的方法 线程的休眠 Thread.sleep() 线程的加入 Thread.join() 线程的中断 Terrupt() 线程的礼让 Thread.yeild()Company Logo线程的操作方法(一)线程的操作方法(一)v线程的休眠 sleep(long millis) Thread类的sleep方法用于让当前线程暂时休眠一段时间 参数millis的单位是毫秒 示例:略Company Logo线程的操作方法(二)线程的操作方法(二)v线程的加入 join() 处在“执行状态”的线程如果
9、调用了其他线程的join方法,将被挂起进入“阻塞状态” 目标线程执行完毕后才会解除阻塞,回到“可执行状态” 例如:A/B是两个线程,在线程A中调用线程B.join(),此时线程A将被阻塞,直到线程B执行完毕 举例:com.bupt.MultiThread.JoinThreadTest.javaCompany Logo线程的操作方法(三)线程的操作方法(三)v线程的中断 Interrupt() 在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。 更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断
10、异常(InterruptedException),从而提早地终结被阻塞状态。 Terrupt()方法不会中断一个正在运行的线程。 举例:com.bupt.MultiThread.InterruptThreadTest.java Company Logo线程的操作方法(四)线程的操作方法(四)v线程的礼让 yield() 它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源让给其他线程,但这只是一种暗示,没有任何一种机制保证当前线程会将资源礼让。 使具有相同优先级的线程有机会进入可执行的机会。 对支持多任务的操作系统来说,不需要调用yield()方法,因为操作系统会为线
11、程自动分配CPU时间来执行Company Logo多线程多线程v线程同步的引出 铁路卖票系统 示例:SellTicketSys.javaCompany Logo线程同步线程同步 多线程应用程序同时访问共享对象时,由于线程间相互抢占CPU的控制权,造成一个线程夹在另一个线程的执行过程中运行,所以可能导致错误的执行结果。Company Logo对象锁对象锁v线程同步 为了防止共享对象在并发访问时出现错误,Java中提供了“synchronized”关键字。 synchronized关键字 确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”
12、基于“对象锁”的概念Company Logo对象锁对象锁vJava对象锁 示例:Company Logo同步方法同步方法v使用synchronized关键字 同步方法同步方法 被“synchronized”关键字修饰的方法称为“同步方法” 当一个线程访问对象的同步方法时,被访问对象就当一个线程访问对象的同步方法时,被访问对象就处于处于“锁定锁定”状态,访问该方法的其他线程只能等状态,访问该方法的其他线程只能等待待 Company Logo同步块同步块v使用synchronized关键字 同步块同步块 如果只希望同步部分代码行,可以使用如果只希望同步部分代码行,可以使用“同步块同步块” 同步块的
13、作用与同步方法一样,只是控制范围有所同步块的作用与同步方法一样,只是控制范围有所区别区别在多线程应用程序在多线程应用程序中,中,obj代表被锁代表被锁定的共享对象定的共享对象 Company Logo线程同步线程同步v正确的售票系统 示例: SynchronousSellTicketSys.javaCompany Logo多线程多线程v线程间的通信 线程之间的通信使用wait()、notify()、notifyAll()方法实现Company Logo多线程同步多线程同步vwait() 调用wait()函数可以让一个线程等待某个条件发生变化,但是这个变化不是当前线程能够控制的。 Wait()会
14、在外部等待世界产生变化的时候把任务挂起,并且只有在notify()、notifyAll()发生时才会被唤醒并且去检查所产生的变化。 Sleep方法调用是不释放锁,但是wait方法会释放锁,让其他需求该锁方法执行vnotify()、 notifyAll() 从wait状态中唤醒线程 Company Logo多线程多线程v注意 只能在同步方法或者同步块中调用wait()、notify()、notifyAll(),如果在非同步块或者同步方法中调用这些方法,程序能通过编译,但是运行的时候会得到java.lang.IllegalMonitorStateException异常。 这个异常的原因就是当前线程
15、没有获得对象的锁没有获得对象的锁,或者说,当前调用的对象不是锁对象。当前调用的对象不是锁对象。 调用wait(),notify(),notifyAll()的对象必须是当前锁对象。常见的毛病就是使用了线程对象来调用这些方法Company Logo主要内容主要内容Java异常处理机制异常处理机制1多线程编程多线程编程2垃圾回收机制垃圾回收机制3Java代码优化编程代码优化编程4Company Logo垃圾回收机制垃圾回收机制v概念 GC(Garbage Collection) 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制。 一个对象创建后被放置在一个对象创
16、建后被放置在JVM的堆内存中,当永远的堆内存中,当永远不再引用这个对象时,它将被不再引用这个对象时,它将被JVM在堆内存中回收。在堆内存中回收。被创建的对象不能再生,同时也没有办法通过程序被创建的对象不能再生,同时也没有办法通过程序语句释放它们。语句释放它们。 Company Logo垃圾回收机制垃圾回收机制class node int value;node next;node p, q;p = new node();q = new node();q = p;Company Logo垃圾回收机制垃圾回收机制vGC的基本原理的基本原理 对于程序员来说,分配对象使用new关键字;释放对象时,只要将
17、对象所有引用赋值为null,让程序不能够再访问到这个对象,我们称该对象为不可达的.GC将负责回收所有不可达对象的内存空间。 GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。 两种常用的方法 引用计数 对象引用遍历Company LogoGC常用收集器(一)常用收集器(一)v引用计数收集器引用计数收集器 原理:引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但
18、当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。Company LogoGC常用收集器(一)常用收集器(一)v引用计数收集器优缺点引用计数收集器优缺点 优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。 缺点:引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域生,计数器减1。Company LogoGC常用常用收集器收集器(二)(二)v标记标记-清除收集器清除收集器 原理:这种收集器首先
19、遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。 注意: 只有当堆满的时候,才开始标记-清除过程。 首先,遍历跟踪运行时栈指向的所有引用,把他们指向的内存设为标记。 然后检测堆块中没有标记的块,释放这些内存。Company LogoGC常用常用收集器收集器(二)(二)v标记标记-清除收集器优缺点清除收集器优缺点 优点: 也许永远不需要运行跟踪收集器,因为只有在heap满的时候才运行。 跟踪收集器可以发现并释放所有不可用
20、的内存 缺点:GC需要停止其他的活动。这种方法意味着所有与应用程序相关的工作停止,只有GC运行。在运行期间这种不可预期的中断也许是某些应用不能接受的。Company LogoGC常用常用收集器收集器(三)(三)v复制收集器复制收集器 原理:这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。Company LogoGC常用常用收集器收集器(三)
21、(三)v复制收集器复制收集器优缺点优缺点 优点:相比于标记-清除收集器,复制收集器较快。 缺点:只能使用一半的堆空间。Company Logo总结总结v垃圾收集器的作用垃圾收集器的作用 Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情: 发现无用信息对象 回收被无用对象占用的内存空间,使该空间可被程序再次使用v其他垃圾收集器其他垃圾收集器 略Company Logo主要内容主要内容Java异常处理机制异常处理机制1多线程编程多线程编程2垃圾回收机制垃圾回收机制3Java代码优化编程代码优化编程4Company LogoJava优化编程优化
22、编程v尽量复用对象 例如String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。 示例: String a=“hello”;String b=“world ”;a=a+b;helloworldhello worldabCompany LogoJava优化编程优化编程换作StringBufferStringBuffer a=“hello”;StringBuffer b=“world ”;a=a+b;helloworldabhello worldJava优化编程优化编程 由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 32960.4-2025电动汽车远程服务与管理系统技术规范第4部分:一致性测试
- 2025年心理健康教育知识考察试卷及答案
- Cytochalasin-L-生命科学试剂-MCE
- 2025年青少年心理辅导人才认证考试试题及答案
- 2025年企业战略与竞争优势知识考试试卷及答案
- 2025年民事法律知识考试试卷及答案
- 2025年科学技术协会职称考试试卷及答案
- 2025年环境科学与工程行业能力测试题及答案
- 2025年地理科学专业入学考试试卷及答案
- 2025年国家心理咨询师执业资格考试题及答案
- 教育事业十五五(2026-2030)发展规划
- 2025年中医基础理论考试试题及答案
- 酒店入股合同协议书范本
- 外研版七年级英语上册跨学科项目计划
- 河南省南阳市2025年七年级英语第二学期期末学业水平测试模拟试题含答案
- 2025年瑜伽教练认证考试体式教学与课程设计模拟试题集(含答案详解)
- 2025年英语专业四级(TEM4)完形填空专项模拟试卷(词汇与逻辑推理)-深度解析版
- 2025年广西高一学业水平考试模拟生物试卷试题(含答案)
- 综合实践项目 设计并制作人体结构模型(教学设计) 七年级生物下册 (人教版2024)
- TCCEAS001-2022建设项目工程总承包计价规范
- 思想道德与法治(湖南师范大学)智慧树知到期末考试答案章节答案2024年湖南师范大学
评论
0/150
提交评论