资源描述
目录1.小知识点.72.两个变量的值互换(不使用第三方变量).73.new.84.取数组最大值问题.85.s w ic h.96.for.97.排序.97.1 选择排序.97.2 冒泡排序.108.折半查找.119.进制转换.1110二维数组小知识.141 1.构造代码块.141 2.t his 关键字.151 3.java中的访问控制.151 4.s t at ic.1515.主函数.1616.静态代码块.1717.对象的初始化过程.1718.设计模式-一单例设计模式.171 8.1 饿汉式.181 8.2 懒汉式.1919.继承.2020.方法的覆盖.2021.子父类中的构造函数.2022.final.2123.abs t rac t 抽象.2124.模板设计模式.2225.接口.2226.多态.2327.内部类.2328.匿名内部类.2428.1 概念.2428.2 题目:补充代码,要用匿名内部类.2629.异常.2829.1 t hrow 和 t hrow s.2829.2 Runt imeExc ept ion.2829.3 异常在子父类中的用法.2830.访问权限.2931.多线程.2931.1 概念.2931.2 小知识.3031.3 线程的第二种创建方式.3031.4 继承和实现的区别.3031.5 多线程安全问题一同步代码块.3131.6.多线程安全问题一同步函数.3131.7 多线程安全问题一静态函数的同步锁.3231.8 多线程安全问题一单例模式一懒汉式.3231.9 多线程安全问题一死锁.3331.1 0.等待唤醒机制.3431.1 1.生产者消费者.3431.1 2 停止线程.3531.1 3.守护线程.3531.1 4.join 方法.3531.1 5.线程优先级(1-1 0级).3531.1 6.yiel d.3531.1 7.多线程一实际用法之一.3632.St ring 类.3732.1 St ring 说明.3732.2.St ring 常见操作.3732.3.字符串练习.3932.4.练习二,字符串反转.3932.5.获取子串出现的次数.4032.6.练习四:判断两个字符串中最大的相同子串.4132.7改 进版:判断两个字符串中最大的相同子串.4233.St ring Buffer.4234.St ring Buil der.4435.基本数据类型对象的包装类.4436.集合框架.4636.1.迭代器.4636.2.Lis t.4836.3.Lis t it erat or.4936.4.常用集合.5036.5.使用LinkedLis t实现队列.5136.6.ArrayLis t取出重复元素.5136.7.迭代器中的错误使用.5236.8 Lis t判断元素相同.5236.9.Has hSet.5236.1 0.TreeSet.5336.1 1.泛型.5436.1 2.泛型类.5536.1 3.泛型方法.5636.1 4.静态方法泛型.5636.1 5.泛型定义在接口上.5736.1 6.泛型限定.5736.1 7.Map.5936.1 8.Map子类对象的特点.6036.1 9.Map的共性方法.6036.20.Map 集合的取出-keySet 和 ent rySet.601.keys et取出方式.612.ent rySet.6136.21.TreeMap 练习 1.6336.22.TreeMap 练习 2.6436.23.map扩展一集合嵌套.6636.24 Col l ec t ions-s ort.6936.25.c ol l ec t ions-max.7036.26.c ol l ec t ions-binarySearc h.70L举例.702.原理.713.自定义比较器.71l.fil l 方法.722.repl ac e.723.反转 revers e.734.revers Order.735.s huffl e打乱集合中的元素顺序.7436.28.Arrays.74L 举例.742.集合变数组.763.高级for循环.764.可变参数.775.静态导入.7838.Sys t em.7939.Runt ime.804O.Dat e 类.8141.Cal endar.8142.Mat h-Random(java.ut il 中有一个 Random 类).8343.1 0.8443.1 简介.8443.2 字符流.8543.3.1 0的异常处理.8643.4 文件的续写及换行.8643.5 文件的读取1.8743.6 文件的读取2.8743.7 文件的复制.88L复制方式一:读一个写一个.882.复制方式二:先读到缓冲区,再写入.893.原理图.8943.8.BufferedWrit er.9043.9.Buffered Reader.9043.1 0 带缓冲区的c opy.9143.1 1.readLine 原理.9143.1 2 装饰设计模式.9243.1 3.LineNumberReader带行号的字符缓冲区.9343.1 4 自定义的 LineNumberReader.9443.1 5 字节流.951.写方法,不用刷新就可写入.952.读方法1.963.读方法2(建议使用这种方法).964.读方法3.9643.1 6 复制一个图片.9743.1 7.mp3 的复制.9843.1 8 自定义缓冲区.9843.1 9 读取键盘录入.9943.20 字节流转换成字符流.10143.21 字符流转换成字节流.10243.22 流的操作规律.10243.23 改变标准输入输出设备.10543.24 异常的日志信息.10543.25 系统信息.10643.26 Fil e 类.1061.概述.1062.Fil e对象功能.10743.27 Propert ies.1131.简介.1132.存取.1143.propert ies练习:记录软件运行次数.11543.28 打ER流 Print erWrit er.11643.29 Sequenc einput s t ream.11743.30 切割文件.11843.31 对象的序列化.11943.32 管道流.12043.33 特殊类 RandomAc c es s Fil e(重点掌握).1211.简介.1212.写方法.1223.读方法.12243.34 操作基本数据类型的流对象 Dat al nput St ream 和 Dat aOut put St ream.1231.写入.1232.读取.1233.w rit eUTF()和 readUTF().12343.35 Byt eArraySt ream.12443.36 字符编码.1261.简介.1262.原理图.1273.字符的再编码再解码1.1274.字符的再编码再解码2.1285.联通一g bk和ut f-8重复的地方.1283.练习.12844.GUI.13244.1总体架构.13244.2布局管理器.13344.3活动监听和鼠标事件监听.13444.4.列出指定目录的内容.13544.5对话框.13644.6 菜单.13744.7打开文件.13844.8保存文件.13844.9 jar包双击执行.13945.网络编程.14045.1 基本知识.14045.2.IP 地址.14145.3.TCP 和 UDP(重要).14145.4 Soc ket.14245.5 Udp.142l.udp发送端.1422.udp接收端.1433.读取键盘录入.1444.聊天.14545.6 TCP.147L 概念.1472.演示TCP传输.1483.服务端和客户端的交互.1494.TCP 练习.1515.TCP复制文件.1536.上传图片.1547.并发上传图片.1568.客户端并发登录.1599.自定义服务端.16210.自定义浏览器客户端-t omc at服务端.1621 1.URL.16346.正则表达式.16446.1.演示.16446.2 匹配.16546.3 切割 St ring s pl it().16646.4 点的切割.16646.5 反斜杠的切割.16746.6 组.16746.7 替换.16746.8 获取.16846.9 练习 1.16946.1 0 练习 2.17046.1 1 练习3:校检邮箱地址(必须掌握).17046.1 2 网页爬虫(蜘蛛).1711.获取指定文档内容中的邮箱地址.1712.从网页上获取.17147.知识点补充.17247.1 字符集简介.17247.2 JDK7的新特性.17247.3 运算的类型提升.17347.4 程序执行过程的内存分析图.17347.5 垃圾回收机制(Garbag e Col l ec t ion).17547.6 构造方法(构造器).17547.7 s t at ic 关键字.17647.8 t his 关键字.17747.9 继承.17847.1 0 Objec t 类.17847.1 1 s uper 关键字.17947.1 2 final 关键字.17947.1 3 访问控制 publ ic defaul t prot ec t ed privat e.1 8047.1 4 多态.1 80L小知识点1.1 命令行中的s et pat h1.2 可以使用注释来调试程序,来缩小问题范围1.3 先写注释:需求,思路,步骤1.4 进制之间的转换,-6的二进制是6的二进制取反加11.5 生成文档说明书1.6 byt e 4 位,s hort 8 位,int 32 位,l ong 64 位,fl oat 32 位,doubl e 64 位,整数默认 int,小数默认doubl e。c har 16位1.7 a-97,A-65,0481.8 取模正负看左边(也就是被模数)-1%5=-1 1%-5=11.9 字符串和任何数据使用+,都会连接成字符串1.1 0 w indow s系统中回车符是有两个字符表示的rn1.1 1 s hort s=4;s=s+5;(出错)s+=5;(不出错,这个会有一个自动转换的过程)1.1 2 x左移n位是x乘以2的n次基,x右移n位是x除以2的n次幕。位运算是最快的。空位补原来的最高位数据,空位补01.1 3 位运算符:&、卜(取反)、人(异或,一个数异或一个数两次,还是原来的数)&:6&3=2;110 1&01 1 丁010=2;2,两个变量的值互换(不使用第三方变量)方法一:int m=3,m=8;n=n+m;m=n-m;n=n-m;如果n和m的之非常大可能会超出int范围方法二:n=n A m;m=nAm;/(nAm)Amn=nAm;/nA(nAm)3.newnew出来的东西都在堆里面。堆内存里的数据有默认的值,int默认0,布尔默认fal s e。只 有引用类的才能使用nul l4,取数组最大值问题取得数组最大值,可以初始化max为arr,也可以初始化角标(/System.out.printin(Integer.toBinaryString(60);int num=60;获取60的最低4位,通过&15;int nl=num&15;System.out.printin(nl9?(char)(nl-10+*A*):nl);要获取下一组四位,将60右移4位.int temp=60 2s 4;对temp的值进行最低四位的获取.int n2=temp&IS;System.out.printin(n29?(char)(n2-10+*A):n2);/*0-9 A B*C1*D*E 1F,65 66 6710 11 12 13 14 1512-10=2+A*=(char)67;*/int x=lr y;y=(xl)?,a1:200;System,out.printIn(My=,+y);5.swichs w it c h 里只能定义 byt e、s hort、int、c har 类型6.forfor(int x=0/y=l;x9;y+,x+)for(;)for的最简单无限循环尖朝上动条件w:for(int x=0;x3;x+)q:for(int y=0;y3;y+)break w;跳出外层for循环7,排序.7.1 选择排序public static void selectSort(int arr)for(int x=0;xarr.length-1;x+)(for(int y=x+l;yarr.length;y+)if(arr x|arr ly)(int temp=arrx;arrx=arry;arry=temp;)7.2 冒泡排序冒泡排序:相邻的两个元素进行比较,如果符合条件换位。8.折半查找public static int getlndex_2(int arr,int key)(int min=O,max=arr.length-1,mid;while(minarrmid)min=mid 4-1;else if(key 二进制*/public static void toBin(int num)pgBuffer sb=new StringBuffer();while(num0)/System.out.printin(num%2);sb.append(num%2);num=num/2;)System.out.printin(sb.reverse();+进制一 十六进制.*/public static void toHex(int num)(StringBuffer sb=new StringBuffer();for(int x=0;x9)/System.out.printin(char)(temp-10-sb.append(char)(temp-10+else/System.out.printin(temp);sb.append(temp);num=num 4;System.out.println(sb.reverse();,4,5,6,7 8-9 A3 A,C-D-EF;定义一个临时容器U char arr=new char8;int pos=arr.length;while(num!=0)(int temp=num&15;/System.out.printin(chstemp);arr-pos=chstemp;num=num 4;$干System.out.printin(M-s=n+pos);存储数据的arr数组遍历。for(int x=pos;x 1;)for(inr x=pos;xJava MainDemo hahaliaha he he he ihe iD:Jaua0217day06 16.静态代码块当一个类加载的时候,先加载静态代码块,再加载构造代码块,最后加载构造函数17.对象的初始化过程Pers on p=new Pers on(zhang s an/20);该句话都做了什么字情?1,因为new用到了Pers on.c las s.所以会先找至Pers on.c las s文件并加找到内存中一2,执行该类中的s t at ic代码块,如果有的话,给Pers on.c laS3类进行而始立u3,在堆内存中开注空间,分配内存_4 在eT芬中建二七客函:手有底性.一运;亍题认3砧化.5,对属性进行显示初始花.6,对对象进行构造代码块初始化。7,对对装进行对应的构造函数初始化.8,将内存地址付给我内存中的p变鬟.18.设计模式.一单例设计模式/*设计模式:解决某一类问题最行之有效的方法.j aval 2 3种设计模式:单例设计模式:解决一个类在内存只存在一个对象:想要保证对象唯一.1,为亍避免竟他警序过多建立该类对象=先禁止其他程序建立该类对象2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象.3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式.这三部怎么用代码体现呢?声,将构造函数私有化=吼 在类中创建一个本类对象.3,提供一个方法可以获取到该对象.对于事均该怎么描述,还怎久描述.当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可.18.1饿汉式class Student j(private int age;I private static Student s=new Student();private Student()public static Student getStudent()return s;|)实现单例设计模式最简单的方法,上面三步 一public void setAge(int age)(this.age=age;)public int getAge()这个是先初始化对象.称为:母汉式.Sing le类一进内存,就已经创建好了对象.c las s Sing le(privat e s t at ic Sing le s=new Sing le();privat e Sing le()public s t at ic Sing le g et lns t anc e()ret urn s;)18.2懒汉式对象是方法被调用时,才初始倜,也叫做对象的延时加载。成为:酸汉式.“Sing le类进内存,对象还没有存在,只有调用了g et lns t anc e方法时,才建立对象.c las s Sing le(privat e s t at ic Sing le s=null;privat e Sing le()public s t at ic Sing le g et lns t anc e()(if(s=null)s=new Sing le();ret urn s;)懒汉式有一个缺陷改进见下图:对象是方法被调用时,才初始化,也叫做对象的延时加载.成为:懒汉式.“Sing le类进内存,对象还没有存在,只有调用了g et lns t anc e方法时,才建立对象=c las s Sing le(privat e s t at ic Sing le s=null;privat e Sing le()|s ync hranize(if(s=null)A Bs=new Sing le();ret urn s;上面的程序效率会变低,改进如下:对象是方法被词用时,才初始化,也叫做对象的延时加载.成为:懒汉式.Sing le类进内存,对象还没有存在,只有词用了g e七工ns t anc e方法时,才建立对象 c las s Sing le(privat e s t at ic Sing le s=null;privat e Sing le()public s t at ic Sing le g et lns t anc e()(if(s=null)(s ync hronized(Sing le.c las s)(s=new Sing le();ret urn s;19.继承继承:1.棍高了代码的言田性2,让类与类之间产生了吴系.有了这个关系,才有了多态的特性.注意:千万不要为了获取其他类的功能,筒化代码而继承.;必须是类与类之间有所属关系才可以继承.所属关系is a.|20.方法的覆盖覆盖:1,f类覆或父类,必须保,子类权限大于等于父类权限,才可以覆短,否则编译失败.2,静态只能覆盖静态.2L子父类中的构造函数/*3,子父类中的构造函数.在某子类对象进行初始化时,父类的构造函政也会运行,那是因为子类的构造函数默认第一行有一条除式的语句s uper();s uper():会访问父类中空参数的构造函数.而且子类中所有的构造函数默认第一行都是s uper。;3,子父类中的构造函数.在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条式的语句s uper();s uper。:会访问父类中空参数的构造函数.而且子类中所有的构造函数默认第一行都是s uper();为什么子类一定要访问父类中的构造函数.因为父类中的数据子类可以直接获取.所以子类对象在建立时,需要先查者父类是如何对这些数据进行初始化的.所以子类在对象初始化时,要先访问一下父类中的构造函数.如果要访问父类中指定的构造函数,可以通过手动定义s uper语句的方式来指定.注意:s uper语句一定定义在子类构造函数的第一行.结论:子类的所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每 个构造函数内的第一行都有一句隐式s uper();子类的实例化过程.结论:子类M所有的构造函数,默认都会访问父类中空参数的构造函数.因为子类每一个构造函数内的第一行都有一句院式s uper”;当父类中没有空参数的构造函数时,子类必须手动通过s uper语句形式来指定要访问父类中的构造函数.当然:子类的陶造函数第一行也可以手动指定t his语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数.22.finalfinal:最终.作为一个修饰符,1,可以修饰类,函数,变量=2,被final修饰的类不可以被继承.为了避免被继承,被子类复写功能.3,被final修饰的方法不可以被复写.4,被final修饰的变量是一个常量只能馈值一次,既可以修饰成员变量.有可以修饰寻部变量.当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读.而这个值不需要改变,所以加上final修饰.作为常量:常量的书写规范所有字母都大写,如果由多个单询组或.单词间通过连接.5,内都类定义桂类中的局部位置上是,只能访问该局都被final修饰的局部变量.23.abstract 抽象抽象:看不懂.抽象类的特点:1,抽象方法一定在抽象类中.2,抽象方法和抽象类都必须被abs t rac t关键字修饰.3,抽象类不可以用new创建对象.因为词用抽象方法没意义.4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用二 如果子类只覆蛊了部分抽象方法,那么该子类还是一个抽象类。抽象类和一般类没有太大的不同。该如何描述事物,蜕如何描述事物,只不过,该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现.但是无法定义主体.通过抽象方法来表示.抽象类比一般类多个了抽象函数.放是在类中可以定义抽象方法.抽象类不可以实例化.特殊:抽象类中可以不定义抽象方法,这样啦汉仅是不让该类建立对象.24,模板设计模式需求:获取一段程序运行的时间.原理:获取程序开始和结束的时间并相减即可.获取时间:Sys t em.c urrent TimeMillis();J当代码完成优化后,就可以彝决这类问题.这种方式,模版方法设计模式.什么是模版方法呢?在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去.由该类的子类去完成.25.接口c las s用于定义类 int erfac e用于定义接口接口定义时,格式特点:1,接口中常见定义:常量,抽象方法.2,接口中的成员都有固定修饰符.常量:public s t at ic final方法:public abs t rac t瞠住:接口中的成员都是public 接口:是不可以创建对象的,因为有抽象方法二福要被子类实现,子类对接口中的抽象方法全都覆受后,子类才可以实例化 否则子类是一个抽象类.26.多态i,多态的体现父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象.2,多态的前提必须是类与类之间有关系.要么继承,要么实现.通常还有一个前提:存在覆盖.3,多态的好处多态的出现大大的提高程序的扩展性.4,多?S白勺沙冬端:虽嬴提高了扩展性,但是只能使用父类的引用访问父类中的成员.5,多态的应用|态的出现代码|在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法.如果有,编译通过,如果没有编译失败.在运行时期:参阅对象所属的类中是否有词用的方法.简单总结就是:成员函数在多态调用时,纸译看左边,运行看右边。在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所寓的类)二 在多态中,静态成员函数的特点:无论编译和运行,都参考做左边.27.内部类/*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有.之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的弓I用,格式 外部类名.this 2,外部类要访问内部类,必须建立内部类对象.访问格式:当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中*可以直接建立内部类对象.格式外部类名.内部类名 变量名=外部类对象.内部类对像;IOu ter.Inner in=new Ou ter().new Inner();2,当内部类在成员位置上,就可以被成员修饰符所修饰.比如,privat e:将内部类在外部类中进行封装.s t at ic:内部美就具备s t at ic的特性=当内部类被s t at ic修饰后,只能直接访问外部类中的s t at ic成员.出现了访问局限.在外部其他类中,如何直接访问s t at ic内部类的非静态成员呢?new Out er.Inner().func t ion();在外部其他类中,如何直按访问s t at ic内部类的静态成员呢?ut er.Inner.func t ion();注意:当内部类中定义了静态成员,该内部类必须是s t at ic的.当外部类中的静态方法访问内部类时,内部类也必须是s t at ic的.当描述事物时,事物的内部还有事物,该事物用内部类来描述U 因为内部事务在使用外部事物的内容.修饰符publ ic、privat e、s t at ic等只能修饰成员变量,不能修饰局部变量。/*内部类定义在局部时,1,不可以被成员修饰符修饰2,可以直接访问外部类中的成员,因为还持有外部类中的弓I用.但是不可以访问它所在的局部中的变量。只能访问被final修饰的局笥变量;*/28.匿名内部类28.1 概念7*匿名内部类:1,匿名内翁类其实就是内部类的简写格式。2,定义匿名内部类的前提:内部类必须是继承一个类或者实现接.3,匿名内御:类的格式:new父类或者接口()定义子类的内容4,其实匿名内部类就是一个匿名子类对象二而且这个对象有点胖。可以理解为带内容的对象*5,萱名内部类中定义的方法最好不要超过3个.class Outer(int x=3;/*class Inner extends AbsDemo(void show()(System.out.println(Mshow:*+x);)*/public void function()/newInnei).show();new AbsDemo()void show()Sys.out.printin(“1 0+x);).show();public void function()(/AbsDemo a=new Inner();Inner in=new Inner();in|Jshow();in.abc();AbsDemo d=new AbsDemo()(void show()(Syster.out.printin(:=-x);)void abc()(System.out.printin(二d卜-*);1;d.show();/d.abc();编译失败;28.2题目:补充代码,要用匿名内部类interface Inter void method();class Test(补足代码.通过匿名内部类。I)class InnerClassTest(public static void main(Siring args)(Test.function().method();)答案:class Test(补足代码-通过匿名内部类./*static class Inner implements Inter(public void method()(System.out.printin(method run);)*/static Inter function()public void method()System.out.printIn(method run”IT/Tes t.func t ion():Tes t类中有-个静态的方法func t ion./.met hodO:func t ion这个方法运算后的结果是一个对象=而且是一个Int er类型的对象=因为只有是Int er类型的对象,才可以调用met hod方法.Tes t.func t ion().met hod();Int er in=Tes t.func t ion();in.met hod();c las s InnerTes t(public s t at ic void main(St ring arg s)(new Objec t()(public void func t ion()(.func t iLn();29,异常如果多个c at c h块中的异常出现继承关系,父类异常c at c h块在最下面29.1 throw 和 throwst hrow s:用在函数上,后面跟异常类,可以跟多个,用逗号隔开t hrow:用在函数内,后面跟的是异常对象29.2 RuntimeException/Exc ept oin中有一个特殊的子类异常Runt imeExc ept ion运行时异常=如果在函数内容抛出该异常,函数上可以不用声明,编语一样通过.如果在函数上声明了该异常=调用者可以不用进行处理。编译一样通过;之所以不用在函数声明,是因为不需要让调用者处理.当该异常发生,希望程序停止.因为在运行时,出现了无法热续运算的情况,希望停止程序后,对代码进行修正.自定义异常时:如果该异常的发生,无法在继续进行运算,蜕让自定义异常继承Runt imeExc ept ion.对于异常分两种:|时被检测的异常.2,编译时不被检测的异常(运行时异常=Runt imeExc ept ion以及其子类)29.3 异常在子父类中的用法/*异常在子父类覆盖中的体现:1,子类在覆蛊父类时,如果父类的方法抛出异常,那么子类的覆懿方法,只能抛出父类的异常或者该异常的子类.2,如果父类方法抛出多个异常,那么子类在覆越该方法时,只能抛出父类异常的子集。3,丫如果父类或者接口的方法中没有异常抛出,那么子类在覆蛊方法时.也不可以抛出异常.1如果子类方法发生了异常.就必须要进行tr y处理.绝对不能抛.|30.访问权限总结:包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。不同包中的子类还可以直接访问父类中被prot ec t ed权限修饰的成员,笆与包之间可以使用的权限只有两种,public prot ec t ed.I publicprot ec t eddefaultprivat eI同一个类中okokokok同一个包中okokok子类okok不同包中ok覆盖时子类的权限大于等于父类权限31.多线程31.1概念/*进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元.线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程.Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中.该线程称之为主线程.扩展:其实更细节流时jvm启动不止一个线程,还育/货垃坡回收机制的线程./如果只调用run方法,没有调用s t art方法,则没有创建线程,只有主线程在执行31.2小知识原来线程都有自己默认的名称UThrad-编号 该编号从0开始.Istatic Thread currentThread():获取当前线程对象.getName():获取线程名称.设置或程名称:setName或者构造函数.31.3线程的第二种创建方式创建线程的第二种方式:实现Runable接口步骤:1 定义类实现Runnable接口2,覆盖Runnable接口中的run方法-将线程要运行的代码存放在该run方法中.3,通过Thread类建立线程对象.4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。为什么要将Runnable接口的子类对象传递给Thread的构造函数.因为,自定义的run方法所属的对象是Runnable接口的子类对象.所以要让线程去指定指定对象的run方法.就耿须明酶该run方法所属对象.5,调用Thread类的s t art方法开启线程并调用Runnable接口子类的run方法.31.4继承和实现的区别实现方式和继承方式有什么区别呢?实现方式好处:避免了单雏承的局限性;在定义线程时,建立使用实现方式。两种方式区别:I魅承Thread:线程代码存放Thread子类run方法中=实现Runnable,线程代码存在接口的子类的run方法。31.5多线程安全问题一同步代码块通过分析,发现,打印出0,-1,-2等错票;多线程的运行出现了安全问题.问题的原因:当多条语句在操作同一个线程共享数指时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行.导致共享数据的错误.解决办法:对多条操作共享数据的语句,只能让一个线程都执行完.在执行过程中,其他线程不可以参与执行.IJava对于多线程的安全问题提供了专业的解决方式。就是同步代码块.s ync hronized(对象)_需栗被同步的代码)对象如同蟆.持有锁的线程可以在同步中执行.没有持有锁的线程即使获取CPU的执行权,也进不去,因为没有获取锁.火车上的卫生间-经典=同步的前提:I,必须要有两个或者两个以上的线程.2,必须是多个线程使用同一个锁.必须保证同步中只能有一个线程在运行.好处:解决了多线程的安全问题=弊端:多个线程需要判断锁,较为消耗资源,31.6.多线程安全问题同步函数同步函数用的是哪一个锁呢?函数需要被对象请用=那么函数都有一个所属对象引用=就是this至 this.2同H已拔使用丁$一31.7多线程安全问题静态函数的同步锁如果同步函数被静态修饰后,使用的锁是什么呢?通过验证,发现不在是t his.因为静态方法中也不可以定义t his.静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象.类名.c las s 该对象的美型是Clas s静态的同步方法,使用丁 一法所在三L三节码文件对象.覆名.c las s318多线程安全问题单例模式一懒汉式class Single(private static Single s=null;private Single()public static Single getlnstance()if(s=null)|(synchronized(Single.class)if(s=null)-A;s=new Single();)return s;31.9多线程安全问题-死锁private boolean flag;Test(boolean flag)(this.flag=flag;public void run()if(flag)(while(true)(synchronized(MyLock.locka)(ISystem.out.printIn(Mif locka);synchronized(MyLock.lockb)System,out.printin(:f lockb,);11)else(while(true)(synchronized(MyLock.lockb)System.out.printin(Melse lockb);synchronized(MyLock.locka)(System,out.printin(else locka*);31.10.等待唤醒机制/not ifyAll();w ait:not ify();not ifyAll();都使用在同步中,因为要举持有监视器(锁)的线程操
展开阅读全文