Java笔记.doc_第1页
Java笔记.doc_第2页
Java笔记.doc_第3页
Java笔记.doc_第4页
Java笔记.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java一、简介31.1 环境变量配置31.2 加包(package)41.3 带包名的编译与运行41.4 引入类(import)41.5生成包注释文档41.6压缩(jar)5二、JVM虚拟机52.1 jvm生命周期52.2 jvm整个类加载过程6三、java基础63.1变量类型63.1.1负数的存储方式73.2.1 类型转换7自动转换7强制转换:73.3.1 变量作用域73.4.1 成员方法83.5.1 运算符8a、如果对负数取模8b、除号“/”8c、比较运算符8d、逻辑运算符8e、位移运算93.6.1 循环9a、break作用9b、return作用9C、continue93.2 数组93.2.1 内存93.2.2 对象比较10= 比较10equals()方法103.2.3值传递103.2.4递归10示例103.2.5 二分搜索法(API binarySearch)11四、面向对象114.1 概述114.2 特征124.3类与对象的关系*124.3.1成员的定义:12*4.4、封装134.4.1构造函数13This关键字14*4.5、继承144.5.1定义144.5.2细节154.5.3 Super和this两个关键字的区别154.5.4 出现方法或变量被屏蔽的场合154.5.5缺点154.5.6建议154.5.7 继承原则164.5.8 特殊情况163、Super语句164.5.9 static关键字164.5.(9) 单例模式174.5.10 final关键字184.5.11 内部类18*4.6、多态20定义:20对象的类型转换:204.6.1重载和重写204.6.2 方法重载204.6.3 方法重写(覆盖)214.6.4 区别214.6.2抽象类和接口抽象类:接口 抽象类与接口的区别22五、异常23六、泛型编程23七、集合与高级数据结构247.1 Set(集)247.2 List(列表)257.2.1 排序267.3 map(映射)26八、i/o系统288.1流的分类28九、线程299.1 线程概念299.1.1 线程优先级299.2 线程的创建339.3 线程的几种状态349.4 线程区别359.5 线程调度359.5.1 线程调度的方法359.6 线程同步(synchronized)369.7线程通信36十、常用的类3710.1 String类3710.2包装类(wrapper)3710.3 Math类38十一、反射机制3811.1 获取类实例3911.2 获取字段(成员的变量)39一、 获取指定声明字段39二、获取全部声明字段40三、获取公共字段4011.3 获取方法4111.4 获取构造方法4211. 5 根据文件名获取路径42十二、网络编程43一、简介 jdk: java开发工具包,包含Jrejre: java运行环境高版本中内置一个小型数据库:derby 1.1 环境变量配置环境变量:1、JAVA_HOME:用来指定jdk安装路径 例子:D:/java/jdk1.5.0_08 2、CLASSPATH:用来指明类路径值为:.(默认在当前路径下查找);%JAVA_HOME%libdt.jar;%JAVA_HOME%libtool.jar; 3、Path:指明可执行命令所在的位置 %JAVA_HOME%bin; 1.2 加包(package)package com,huasoft public class Hello1.3 带包名的编译与运行 sourcepath:指定源文件目录 -d指定生成类文件目录 运行包-cp 指定类文件目录1.4 引入类(import)1.5生成包注释文档1.6压缩(jar)运行:带包名的压缩和运行:f:指定压缩文件名 e运行起始类二、JVM虚拟机2.1 jvm生命周期2.2 jvm整个类加载过程一、装载:它负责找到而二进制字节码文件加载至jvm中,jvm通过类名、类所在的包名并通过ClassLoader(类加载器)来完成类的加载。 二、链接:它是负责对二进制字节码文件进行校验、初始化、装载类中的静态变量以及解析类中的调用的接口、类。完成校验后,jvm初始化类中的类中的静态变量,并将其值赋为默认值。最后对类中的所有属性、方法惊醒验证,一确保其需要调用的属性和方法存在,以及具备应有的权限(public proctected 默认private)会造成NoSuchMethodError NoSuchFiledError等错误信息。 三、初始化:过程即为执行类中的静态初始化代码、构造器代码、静态属性的初始化,触发执行: 调用NEW 反射调用类中的方法 子类调用初始化 jvm启动过程中指定的初始化类。三、java基础java严格区分大小写3.1变量类型1、在JAVA中数字默认的是整型。2、在JAVA里小数默认是double类型的。凡是通过关键字NEW创建的都是引用类型。转换:System.out.println(int(i);3.1.1负数的存储方式3.2.1 类型转换自动转换: 所有的数据类型在进行计算式,都会先提升数据类型然后计算结果(在一个表达式中先将不同的数据类型转换成同一种类型再计算) 强制转换:(开发过程中一定慎用强制类型转换 因为有肯能损失精度或数据溢出)3.3.1 变量作用域 从变量定义开始,到与该变量上面最近的那个开始花括号相对应的结束花括号处结束。3.4.1 成员方法1、好处:1、使用方法可以使代码利用,减少冗余。2、方便修改和维护。3、体现了硬编码和软编码的问题。2、定义和调用:方法调用3.5.1 运算符a、如果对负数取模可以把模数负号忽略不计,但被模数是负数结果页是负数。b、除号“/”整数之间做除法,只保留整数部分而舍弃小数部分。对于浮点数则不舍弃。c、比较运算符instanceof 检查是否是类的对象 如:”Hello”instanceof String 返回trued、逻辑运算符”&”与”&”, 如果使用前者连接,那么无论任何情况下,”&”两边表达式都会参与运算,如果使用后者连接,当左边为false,则不会计算其右边的表达式。 “|”|”, 如果使用前者连接,那么无论任何情况下,”|”两边表达式都会参与运算,如果使用后者连接,当左边为true,则不会计算其右边的表达式。e、位移运算左移运算:左移N位,相当于原数乘以2的N%32次方右移运算:相当于除以2的N%32次方 与的区别: 如果是,如果最高位为1,则左边移空的高位填入1,否则填入0. 不管最高位是0还是1,那么左边移空的高位都填入 循环a、break作用a:在switch语句中中止条件判断;中止循环退出;使用break语句实现跳转(类似goto语句在跳转的地方加以个Lable标签如:名字: )b:在循环体重跳出当前循环(使用label标签,跳转后直接退出循环体)b、return作用返回方法指定类型的值; 结束方法的执行 提前返回C、continue跳过下面的语句从循环处开始,也可以使用label标签。跳转后从标签处开始循环3.2 数组3.2.1 内存 栈内存:所有的基本数据类型的变量都存储在栈内存中,当变量的作用域结束时,它占用的内存会立即释放 引用数据类型:对象的变量(引用句柄)会存储在栈内存中。 堆内存:存储创建的对象,可以是类、接口或数组3.2.2 对象比较 = 比较:如果比较的是基本数据类型,则比较的是他们的值;如果比较的是引用类型,则比较它们的对象首地址。 equals()方法:引用类型才有这个方法,用来比较两个对象的内容是否相等。默认是调用Object类的equal()方法,默认实现是用=比较的。不相等的原因借助Arrays 工具类(实用类)来实现 3.2.3值传递 基本数据类型:不会改变初始值 引用数据类型:引用的是句柄(内存首地址)内容会改变 如:数组3.2.4递归 递归调用:在方法的执行过程中对该方法本身的调用(方法的内容对自身调用) 优点: 逻辑思路清晰 算法明确 缺点: 耗费内存,因为递归时要保存数据和函数的地址,如果次数很多,内存占用很大示例:求N! 3.2.5 二分搜索法(API binarySearch) 注:使用二分搜索法的数组必须是排过序的。 返回的值是搜索值的索引。 四、面向对象4.1 概述注重的是具体的事物,将具体的功能定义到该事物当中。 以后不用再定义具体的功能,只要找到该事物,就已经具备了这些功能。这个事物就称之为对象。4.2 特征封装、继承、多态4.3类与对象的关系*类:就是某先是事物的描述。 类其实就是一组对象的共性属性和行为的一个抽象。类的修饰符只能是public和默认的。对象:就是该类事物具体实实在在存在的个体。 注意:当把一个对象引用变量赋给另一个对象引用变量时,并没有创建该对象的副本,而只是创建该引用的一个副本。(它们并没有任何联系)形参:是一个由方法定义的变量,它在该方法被调用时接受一个值。实参:是一个值,该值在方法被调用时传递给方法。4.3.1成员的定义:变量:成员变量:实例变量和静态(类)变量成员变量和局部变量的区别:1、作用域 2、存储情况 3、初始化方法:成员方法:实例方法和静态(类)方法匿名对象:定义对象的简化形式。使用匿名对象的2种情况:1、 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。2、 我们经常将匿名对象作为实参传递给一个方法调用。 *4.4、封装封装:指隐藏对象的属性和实现细节,仅仅对外公开接口。 优点:1、便于使用者正确、方便的使用系统,防止使用者错误修改系统属性。 2、有助于建立各个系统之间的松耦合关系,提高系统独立性。 3、提高软件的可复用性 4、通过封装降低构建大型系统的风险访问修饰符: Public 对外公开,访问级别最高 Protected:只对同一个包中的类或子类公开 默认:只对同一个包中的类公开。Private:不对外公开,只能在对象内部访问,访问级别最低 封装的原则:1、 把尽可能多的东西隐藏起来,对外提供简捷的接口。2、 原则上把所有的属性藏起来3、 通过public void setXxx(参数)来读,public 返回类型getXxx()return 变量名来赋值4.4.1构造函数 特点: 1、函数名与类名相同 2、不用定义返回值类型 3、没有具体的返回值 在对象建立时就被直接调用。作用:用于初始化对象。细节: 1、在JAVA的每个类中都至少有一个构造方法,如果程序员没在类中定义,系统会默认的为这个类产生一个无参的构造方法,其方法中没有任何代码,什么工作都不做。 2、用户可以自定义构造方法来满足自己的需求,一旦程序员为某个类定义了构造方法,系统就不在提供默认的方法。 3、声明构造方法是,如果没有特殊需要,应使用public来修饰。(private修饰符会在单例模式中使用)This关键字一、 在构造方法(方法)中,如果参数名(局部变量)和成员变量名相同,则默认在方法内成员变量会被屏蔽,通过this关键字打破屏蔽来引用 二、 通过this(参数)来调用相应的构造方法;只能在构造方法中用this调用其他方法;而不能再实例方法中调用其他构造方法。三、 如果this()语句在构造方法中使用时,必须作为构造方法的第一句执行四、 只能用this语句来调用其他的构造方法,而不能通过方法名来直接调用构造方法。五、 在实例方法内,访问当前实例的引用。六、 静态代码块内不能使用this关键字。(静态代码在加载时加载东西而this是在创建对象时加载。) *初始化: 无参数: 有参数: *4.5、继承4.5.1定义4.5.2细节1、 通过继承可以简化类的定义。2、 Java只支持单继承,不允许多继承。3、 Java可以有多层继承。即:一个类可以继承某一个类的子类,如:类B继承类A,类C继承类B,类C间接继承类A4、 子类继承父类所有的成员变量和成员方法,私有的除外。但不能继承父类的构造方法。在子类的构造方法中可以使用语句super(参数列表)调用父类的构造方法。5、 如果子类的构造方法中没有显示的调用父类的构造方法,系统会默认调用父类的无参构造方法。6、 如果子类构造方法中没有显示的调用父类有参的构造方法,而父类中又没有无参的构造方法则编译出错。因此,在定义类时只要定义了有参数的构造方法,通常还要定义一个无参的构造方法。4.5.3 Super和this两个关键字的区别都可以用来覆盖java语言中的默认的作用域,是被屏蔽的方法或变量变为可见。4.5.4 出现方法或变量被屏蔽的场合1、 在一个方法内,当局部变量和类的成员变量同名,或者己部变量和父类的成员变量同名时,按照变量的作用域规则,只有局部变量在方法内可见2、 当子类的某个方法覆盖了父类的一个方法,在子类的范围内,父类的方法不可见。3、 当子类中定义了和父类同名的成员变量时,在子类范围内,父类的成员变量不可见。4.5.5缺点继承关系的最大弱点就是打破了封装。4.5.6建议 1、对这些类必须提供良好的文档说明,使得创建该类的子类的程序员知道如何正确安全的扩展它、 2、尽可能地封装实现细节,就是把代表实现的细节属性和方法定义为private。如果某些细节必须被子类访问,而不覆盖时,可以把这种方法定义为protected类型,就根目录于父类对于子类但不对象公开提供的接口。 3、把不允许子类覆盖的方法定义为final类型的。 4、如果某些类不是被设计用来继承的,可以讲类声明为final类型的。 或者:将父类的所有构造方法声明为private,然后通过一些静态方法来负责创建自身的实例。4.5.7 继承原则1、继承树的层次不可太多,一般层次尽可能保持在两到三层(不考虑顶层Object类)2、继承树的上层尽量设为抽象层。4.5.8 特殊情况 1、当子类中的变量名和父类中的一模一样时,那么子类中的变量会把父类中的变量覆盖。 可以通过super 来把屏蔽的父类变量可见。 2、成员方法:当子类中的成员方法和父类中的成员方法名一样时,子类中的成员方法会覆盖父类中的成员方法。这时可以通过super来指定父类中的方法。3、Super语句*子类的所有构造函数默认都会访问父类中的空参数的构造函数。 当父类中没有定义空参数的构造时,子类必须通过super语句明确指定要访问的父类中的构造函数。简单说::子类的构造函数无论如何,都必须要访问父类中的构造。构造函数:在子类中构造函数第一行有一条隐式的语句super()。 构造函数:子类中的构造函数为什么都有一个默认的super()语句呢?子类在实例化的时候,因为子类继承了父类的成员数据,所以必须先看父类是如何对自己的成员进行初始化的。4.5.9 static关键字 特点: 1、静态成员随着类的加载而加载 2、静态成员优先于对象存在 3、静态成员被所有对象所共享 4、静态成员多了一种调用方法,可以被类名直接调用注意:1、在非静态的成员方法中可以引用类变量和类方法,但是,如果在静态方法中引用非静态变量和非静态方法,则报错。(原因:对于非静态变量和方法,需要先创建类的实例对象后才可以使用,而静态方法在使用前不用创建任何对象),静态方法只能调用同类中的其它静态成员。2、静态方法不能以任何方式引用this和super关键字,道理一样的,当调用静态方法时不用创建任何对象,而this所引用的对象根本没有产生。3、main()方法是静态的,因此在JVM执行main方法是,不创建main方法所在的类的实例对象。因此在main方法中不能直接访问类中的非静态成员。静态代码块:当类被载入时,静态块才执行,且只执行一次,通过它对类属性初始化。或者去加载资源。4.5.(9) 单例模式 在程序应用中只有一个实例对象 实现条件:1、 构造方法私有化,防止用户在外部通过关键字new初始化对象。2、 创建一个私有并静态的本类的对象3、 提供一个公共的静态方法用来返回本类实例的一个对象,否则直接返回。 一、懒汉式单例(单例延迟加载的实例) 二、恶汉式 4.5.10 final关键字1、用final修饰的类时最终的类,不允许被子类继承。2、可以创建类的实例3、用final修饰的方法是最终的方法,不允许被子类覆盖(重写)4、用final修饰的变量是常量,只能初始化值一次,可以在声明时、非静态代码块、和构造方法中初始化;如果用final static修饰,可以再声明或静态代码块中初始化。5、用final修饰的变量会扩大它的作用域4.5.11 内部类 应用场合:当一个类要用到令一个类的实例对象 内部类分类: 成员内部类:外部类名$内部类名。它是指与成员变量、成员方法齐名的内部类,内部类不允许有重名, 局部内部类:$数字(同一个方法内的局部内部类数字相同)指方法中的内部类。不同方法的内部类 可以有重名, 访问外部成员 静态内部类: 调用 定义 匿名内部类:$数字 没有名称 *4.6、多态定义: 1、多态性是指“多种形式”,“一个对外接口,多个内在实现方法。”对象的类型转换:1、可以通过子类实例化父类 2、如果通过父类实例化子类,则会出现编译错误。可以通过强制类型转换来解决,但是运行的时候,会出现类型转换异常(ClassCaseException)3、instanceof操作符:判断一个类是否实现了某个接口,也可以用来判断一个实例对象是否属于一个类。作用是测试它左边的对象是否是它右边的类的实例。4.6.1重载和重写 重载和重写是多态的体现。4.6.2 方法重载 定义:如果类的方法(包括从父类中继承的方法),同时存在一个以上的同名成员方法,只要它们的参数列表(数据类型、个数、顺序)不同,即一个方法是另一个方法的重载方法。 条件:1、方法名相同 2、方法的参数类型、个数、顺序至少有一项不同。 3、方法的返回类型可以不同 4、方法的修饰符可以不同4.6.3 方法重写(覆盖) 定义:如果子类的方法与父类中被子类访问的方法是相同的名字、参数列表和返回值类型,即子类的方法重写了父类的方法。条件:1、子类重写父类的方法时 不能使用比父类更低的访问权限。2、子类方法的名称、参数和返回值类型必须与父类的方法名称、参数和返回类型一致。3、方法的重写只存在子类和父类之间,在同一类中方法只能被重载不能被重写。4、父类的静态方法不能被子类覆盖为非静态方法,5、子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法;【在编译时。子类定义的静态方法也必须满足于方法覆盖类似的约束】 子类隐藏父类的静态方法和子类覆盖父类的实例方法区别在于: 运行时,java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定 6、父类的非静态方法不能被子类覆盖为静态方法 7、父类的静态方法不能被子类覆盖 8、父类的抽象方法可以被子类通过2中途径覆盖:一是子类实现父类的抽象方法; 子类重新声明父类的抽象方法。 9、父类的非抽象方法可以被覆盖为抽象方法。4.6.4 区别 相同点:1、 都要求方法名相同2、 都可以用于抽象方法和非抽象方法之间 不同点:1、 方法重写要求参数签名必须一致,方法重载要求参数签名必须不一致2、 方法重写要求返回类型必须一致,而方法重载对此不作限制3、 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法。4、 父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次5、 方法覆盖对方法的访问权限有特殊要求,而方法重载没有限制。4.6.2抽象类和接口抽象类:1、 含有抽象方法的方法一定是抽象类,但是抽象类中不一定有抽象方法。2、 抽象类不能被实例化,也就是不能用new关键字产生对象3、 抽象方法只需要声明,不需要实现。4、 含有抽象方法的类必须被声明为抽象类,那么抽象类的子类必须重写(覆盖)父类中所有的抽象方法后才能被实例化,否则这个子类还是抽象类(关键字声明为抽象类)。5、 抽象类中可以有构造方法但不能被声明为抽象的。(否则报错)6、 Final和abstract两个关键字不能同时出现,final修饰的方法不能被重写,而abstract修饰的方法要求子类(非抽象的)必须重写。7、 Static方法不能是抽象的。接口 定义接口是interface 声明接口是implements 1、在接口中,变量默认的都是public static final;成员方法都是public abstract类型的,所有的方法都是抽象的。 2、我们可以定义一个新的接口用extends关键字去继承一个或多个已有的接口 3、我们也可以定义一个类用implements关键字去实现一个或多个接口中的所有方法,我们还可以定义一个抽象类用implements关键字去实现一个或多个接口中定义的部分方法。 4、一个类可以继承一个父类的同时,可以实现一个或多个接口,extends关键字必须位于implements关键字之前。 5、接口可以继承一个或多个接口,类可以继承类。但接口和类之间不能继承 6、实现一个接口就要实现该接口中所有的方法,除非该类是抽象类。 7、多个无关的类可以实现同一个接口,同一个类可以实现多个无关的接口 8、接口是一种特殊的抽象类,二者都可以实现多态, 抽象类与接口的区别 1、抽象类与子类就像是父子关系,子类继承了父类共性基因,子类天生具备 2、接口与子类就像是上下级的关系,领导的任务(方法)必须由接口的实现者(子类)完成,子类的接口可以有很多,正如一个人在公司有很多领导 从血缘关系区别:继承: 父子有联系,继承了父母的性格,具有先天性,如继承遗产属于自己的 is a的关系 实现:完成【子类之间没有联系的】 like a 的关系完成领导的任务、老师的作业,五、异常 异常类 根类Throwable Error :表示仅靠程序本身无法恢复的严重错误,比如空间不足, 在大多数情况下遇到这样的情况建议将程序终止 该类及其子类我们称为致命性类,通常用来描述JVM运行系统的内部错误,严重情况 Exception :非致命性类,因编程错误或偶然的外在因素导致的一般性问题,可以通过捕获异常后正常运行,保持程序的可读性和可靠性。 Throws 声明异常自定义异常: 六、泛型编程 在泛型中没有传递参数默认是Obj。 将运行时期的错误提到编译器来。使用规则和限制:1、 静态变量不能够使用泛型定义2、 泛型的参数只能是引用类型,不能是基本数据类型。3、 同一种泛型可以对应多个版本(因为参数类型是不确定的),而不同版本的泛型类实例是不兼容的。4、 泛型的类型参数可以有多个(不同参数之间用逗号隔开。)5、 泛型的参数可以使用extends关键字,如(E extends Number),此时习惯性的称为“有界类型”6、 泛型的参数类型还可以是通配符类型。如;Class class Ttype=Class.forName(java.lang.String) 七、集合与高级数据结构 数组缺点: 1、在同一数组中只能存放相同的类型的数据 2、创建数组时,必须制定数组的长度 优点:既可以存放基本数据类型又可以存放引用数据类型的数据 集合优点: 1、能够方便存储和操纵数目不固定的一组数据 缺点:java集合中不能存放基本数据类型,只能存放引用类型,类型可以不同7.1 Set(集) 特点:最简单的一种集合,集合中的对象不按特定方式排序,并且没有重复对象。 总结: 1、set采用对象的equal()方法比较两个对象是否相等,而不是采用“=”比较运算符 2、HashSet中的类,不但要覆盖类中的equal()方法,而且要覆盖hashCode()方法,否则,就会出现equal()为true,但是hashCode不一定一样。 3、TreeSet中排序支持两种方法:自然排序和客户化排序, 默认情况下,采用自然排序方式。 1、自然排序 在jdk类库中,有一部分类实现了Comparable接口 如 在Comparable接口中有一个compareTo(T o)方法,它返回整数类型,对于表达式pareTo(y),如果返回值为0说明x和y相等的;如果大于0,表示xy;如过小于0,表示xy。 2、客户化排序 Java.util.Comparator提供了具体的排序方式,Type指定被比较的对象类型,Comparator接口中有int compare(T o1 T o2)方法,用于比较两个对象大小,如果compare(x,y),如果返回值小于0说明xy。7.2 List(列表)ArrayList1、 数据组织类似数组,顺序存放2、 可以动态更改长度3、 通过下标访问 特征:其元素以线性方式存储,集合中允许存放重复对象。 Iterator 迭代器 遍历 根据索引遍历 向集合中插入元素根据值返回索引位置从前往后找7.2.1 排序 排序7.3 map(映射) Hashmap 集合中不允许重复【如果重复相当于替换】, 值可以重复 Hashmap key值允许为null 特点: 数据组织通过hash算法 无固定顺序存放 通过键值访问 加载因子: Size / capacity 集合中元素数目 集合容量 加载因子默认值为0.75在时间和空间成本上寻求一种折中。八、i/o系统8.1流的分类 1、 根据操作单位不同分为:字节流和字符流 字节流:InputStream / OutputStream 字符流:Reader / Wirter 2、使用功能不同分为:节点流 和 过滤流 节点流:程序用于直接操作目标设备所对应的类 过滤流:(处理流类或包装类,通过一个间接流去调用节点流,已到达更加灵活方便的读写各种类型的数据。) 节点流类型 字符流 字节流File FileReader FileInputStream FileWriter FileOutputStreamMemory Array CharArrayReader ByteArrayInputStream CharArrayWirter ByteArrayOutputStreamMemory String StringReader StringWriterPipe(管道) PioedReader PipedInputStream PipedWriter PipedOutputStream 处理流处理类型 字符流 字节流Bufferring BufferedReader BufferedInputStream BufferedWriter BufferedOutputStreamFiltering FilterReader FilterInputStream FilterWriter FilterOutputStream字节与字符转换 InputStreamReader OutputStreamWriter对象序列化 ObjectInputStream ObjectOutputStream数据转换 DataInputStream DataOutputStreamPrinting PrintWriter PrintStream九、线程 9.1 线程概念 线程是指进程中的一个执行流程,有时也称为执行情景。一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务。 区别: 1、每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销 2、线程可以看成是一种轻量级的进程。同一类的线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程间切换开销较小。 多进程:在操作系统中同时运行多个任务 多线程:在同一个应用程序中有多个顺序流同时执行。 9.1.1 线程优先级 MAX_PRIORITY =10 MIN_PRIORITY=1 NORM_PRIORITY=5 (默认优先级)9.2 线程的创建 一、定义一个线程类的子类,并重写线程的run方法,run方法就是你的线程体 二、实现接口Runnable 重写接口run方法 三、Thread与Runnable区别 实现Runnable接口相对于继承Thread类来说有以下几个好处:1、 适合多个相同程序代码的线程去处理同一资源的情况(注:用static 来实现资源共享)2、 可以避免由于java的单继承特性带来的局限,3、 有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。9.3 线程的几种状态 一、新建状态(new) 使用new语句创建的线程对象处于新建状态,此时它和其它java对象时一样的。 二、就绪状态(Runnable) 当一个线程对象创建后其它线程调用它的start()方法,此时该线程进入就绪状态【它位于可运行池中,等待获得cpu的使用权】 三、运行状态(Running) 处于这个状态的线程占用cpu,执行程序代码 四、阻塞状态(blocked) 是指线程因为某些原因放弃CPU,暂时停止执行。 阻塞状态分为以下三种情况:1、 位于对象等待池中的阻塞状态:当线程处于运行状态时,如果执行了该线程的wait()方法,java虚拟机就会把该线程放到对象等待池中。2、 位于对象锁池中的阻塞状态:当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其它线程占用,java虚拟机就会把该线程放入对象的锁池中。【同步关键字Synchronized】3、 其它阻塞状态:当线程执行了sleep()方法或者调用了其它线程的join()方法,或者发出i/o请求就会进入这个状态 五、死亡状态 当线程退出run()方法时,就进入死亡状态。该线程生命周期结束。9.4 线程区别 守护线程、用户线程、后台线程:与前台线程相伴相随,只有所有前台线程都结束了,后台线程才会结束生命周期 前台线程:默认的main主线程就是前台线程,由前台线程创建的线程在默认情况下也是前台线程。可以调用Thread的setDaemon(true)方法,把线程设置为后台线程。9.5 线程调度 线程调度模型:1、 分时调度模型:指让所有的线程轮流获得CPU使用权,并且平均分配每个线程占用时间2、 抢占式调度模型:java是采用这种调度,指优先让处于可运行池中的优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么随即选择一种线程占用CPU。9.5.1 线程调度的方法线程睡眠Sleep():一个线程执行了sleep()静态方法,就会放弃CPU,转到阻塞状态,必须处理中断异常。结束睡眠后,转到就绪状态。线程让步Yield()方法:将把当前的线程放到可运行池中,并使另外一个具有相同优先级的处于就绪状态的线程运行。等待其他结束Join()方法:当前线程调用另外一个线程的join()方法时,当前运行的线程就转到阻塞状态,直到另外一个线程运行结束,才转到就绪状态。Sleep()方法和yield()方法的区别: 相同点:两者都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程。 不同点:1、sleep()方法 会给其它线程运行机会,而且不考虑其它优先级,因此会给较低优先级的线程运行的机会。 而yield()方法 只会给相同优先级或更高优先级一个运行的机会。 2、当执行sleep(时间)方法后,它会转到阻塞状态,参数指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。 3、sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常。 4、sleep()方法比yield()方法,具有更好的可移植性。不能只依靠yield()来提高程序的并发性能,大多数情况下,yield()方法的唯一用途是在测试期间人为的提高程序的并发性能,目的是帮助发现一些隐藏的错误。Join()方法: 9.6 线程同步(synchronized) 注:1、snychronized关键字绝对不能加在run()方法前,由于在线程的整个生命周期内它一直在运行,因此将导致它对本类任何synchronized方法的调用都不会成功。 2、同步:多个线程访问一个对象,保持对象的同一性和完整性 3、每个java对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁。 4、对象的一把锁会锁住所有被synchronized修饰的方法,一个线程访问一个同步方法,对象上了锁,其它线程无法访问这个同步方法。 5、当一个线程执行一个对象的同步代码块(同步方法),其它线程仍然可以执行对象的非同步方法(代码块) 6、静态方法前也可以加synchronzied关键字 7、当一个线程进入同步代码块时,并不意味着代码必须以不中断的方式运行(代码里可以用sleep() yield(),让程序暂时执行,此时只是让出CPU,给其它线程一个运行的机会,但并不释放同步。9.7线程通信 Wait():1、执行该方法的线程释放对象的锁。2、java虚拟机把该线程放到该队形的等待池中。该线程等待其它线程将它唤醒。 Notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程。Java虚拟机从对象的等待池中随即的选择一个线程,把它转到对象的锁池中。 Notifyall():唤醒在此对象监视器上等待的(其它)所有线程。十、常用的类10.1 String类 String 和StringBuffer的区别? 相同点:1、 都用来处理字符串2、 都提供了length() toString() charAt() substring()方法,它们在2个类中用法相同3、 字符早字符串中的位置都是从0开始4、 两个类中的substring(begin,end)截取字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论