线程的生命周期
新建→就绪→运行→阻塞→死亡
New→Runnable→Running→Blocked→Dead
调用start进入就绪。
线程死亡:run或call方法执行完成
抛出未捕获的异常Exception或Error
调用线程的stop方法(不推荐,容易死锁)
isAlive()中间三种状态返回true
join方法让一个线程等待另一个线程完成
后台线程/守护线程/精灵线程 特征:前台线程全部死亡,后台就会自动死亡
如jvm的垃圾回收线程
O.setDaemon(true)设O对象为后台线程,
线程睡眠:sleep,让线程暂停,进入阻塞状态
线程让步:yield,让线程进入阻塞状态,有优先级的执行
setPriority()设置线程优先级
JVM终止:
程序正常结束
程序使用System.exit() Runtime.getRuntime().exit()
遇到为捕获的异常
程序所在平台强制结束Jvm进程
类加载或类初始化:加载→连接→初始化
类加载是指,将类的class读入内存,并为之创建一个java.lang.Class对象。当程序使用任何类都会创建这么一个对象。
类加载由类加载器完成,由JVM提供
类的连接:把类的二进制数据合并到JRE中
验证→准备→解析
验证内部结构是否正确,和其他类是否协调
准备:分配内存、设置初始值
解析:将类的二进制数据中的符号引用替换成直接引用
创建实例的方法:new、反射、反序列化
同一个类:全限定类名(包名、类名)JVM中靠全限定类名和加载器
JVM启动时,会形成由三个类加载器组成的初始类加载器的层次结构
Bootstrap ClassLoader:根类加载器
Extension ClassLoader:扩展类加载器:加载JRE扩展目录中JAR包的类
System ClassLoader:系统类加载器
JVM类加载机制
全盘负责:class所依赖的和引用的其他Class也由该类加载器负责载入
父类委托:先让父类加载器试图加载该Class
缓存机制:所有加载过的Class都会被缓存,若不在缓存区,系统会读取其二进制数据,并将其转换成Class对象。修改了Class必须重新启动JVM
通过反射创建对象两种方式
①使用Class对象的newInstance()方法来创建该Class对象对应类的实例
执行newInstance()方法实际是利用默认构造器来创建该类的实例
②先使用Class对象获取Constructor对象,再调用Constructor的newInstance方法来创建该Class对象对应的类的实例。
第一种方式比较常见
Public
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程
IO
异常
检查异常需要手动抛出
集合
Static修饰的成员不能访问没有static修饰的成员,例如main方法要先创建对象,才能访问Sting、int之类的。通过实例可以访问类变量,因为类变量都在一块内存区里。
Static的真正作用:区分成员变量、方法、内部类、初始化块4
Java通过new调用构造器,构造器构造实例,构造器是类创建对象的根本途径。
构造器的返回值默认是隐式的。
方法名以英文动词开头,void用来声明方法没有返回值,否则有return
同一个对象里的一个成员可以直接调用另一个成员,即省略this
Java里的方法的参数传递方式只有一种:值传递
子类无法访问父类被覆盖的方法,但可通过super或父类类名来调用。子类和父类的private方法同名不是重写。
外部类访问权限只需要给同一个包和任何位置,所以public和 默认 。内部类可以使用四种访问权限。
JUC:
New Thread(new Runnable(){重写run方法}).start
两同:1)方法名2)形参列表两小:1)返回值类型比父类更小或相等2)异常比父类方法更小或相等一大:子类权限比父类大或相等
被覆盖的方法不能为private
命名合法:开头_、$ 、_1_
接口定义的成员变量默认public static final,所有成员方法为 public /abstract,只能被public和abstract修饰
构造方法无法被程序调用
初始化顺序:静态成员变量、成员变量、构造方法
按值传递不会改变实际参数的数值
按引用传递不会改变实际参数的参考地址,但能改变实际参数的内容
编译失败,方法体中的有static
线程和进程的区别
Java中可作为gc root 的对象有哪些?
1 、 虚拟机栈(栈帧中的本地变量表)中引用的对象。
2、 本地方法栈中JNI(即一般说的native方法)引用的对象。
3、 方法区中的静态变量和常量引用的对象。
-ha���W��k