多线程
1. start()方法的作用
2. 调运start后jvm中内存分配情况
3. 创建线程的方式
4. sleep方法
线程对象.interrupt()
方法,干扰,让线程终止睡眠状态,不是终止线程。
sleep方法不会释放锁,wait方法释放锁。
5. 强制终止一个线程
方法一:线程对象.stop()
方法,终止当前线程,但是可能出现数据丢失,该方法已过时。
方法二:改标记,设置一个标记flag,为true线程就继续执行,为false就终止执行,先保存数据,然后直接return。
6. 线程安全问题
什么时候存在线程安全问题?
- 多线程并发;
- 有共享数据;
- 共享数据有修改行为。
怎么解决线程安全问题?
线程排队执行(不能并发),线程同步机制。
(异步就是并发,同步就是排队)
7. 守护线程
java语言中线程分为两类:用户线程和守护线程。
用户线程一旦结束,守护线程自动结束。
守护线程如垃圾回收线程。
语法格式是:在.start()之前将线程利用.setDeamon(true)方法设置为守护线程。
8. wait()和notify()
- 任何一个java对象都有wait()和notify()方法
- wait()方法作用:
wait()会释放o对象上的锁
- notify()方法作用:
notify不会释放锁。
9. 生产者消费者
反射机制
10. 反射机制
- 反射机制有什么用?
通过java语言中的反射机制,可以读和修改字节码文件。 - 反射机制的相关类在哪个包下?
java.lang.reflect.*; - 反射机制相关的重要类有哪些?
java.lang.Class:代表整个字节码,代表整个类
java.lang.reflect.Method:代表字节码中的方法字节码,代表类中的方法
java.lang.reflect.Constructor:代表字节码中的构造方法字节码,代表类中的构造方法
java.lang.reflect.Field:代表字节码中的属性字节码,代表类中成员变量(静态变量+实例变量) - 获取class
第一种方法:forName方法
第二种方法:java中任何一个对象都有个方法 getClass()
第三种方法:Java语言中任何一种类型,包括基本数据类型,都有.class属性
11. 通过反射实例化对象
通过Class的newInstance()方法实例化对象,newInstance()方法内部实际上调用了无参数构造方法,必须保证User这个类的无参构造存在。
反射机制更灵活
12. Class.forName()发生了什么
如果只希望某个类的静态代码块执行,可以采用Class.forName()的方式。
因为Class.forName()会导致类加载,类的静态代码块在类加载的时候执行。
13. 获取类路径下文件的绝对路径(背会)
下面代码获取绝对路径是通用的,但是有个前提,就是你要获取的这个资源(这里是classinfo2.properties),一定要在类路径下才行(就是src路径下),逃出src就不行了。
必须从类的根路径下作为起点开始
14. 资源绑定器
15. 补充
16. 反射属性Field
获取类中public修饰的属性:类名.getFields()
,返回值类型是Field[]。
获取类中所有属性:类名.getDeclaredFields
,返回值类型是Field[]。
获取类中属性类型:.getType()
获取类中修饰符:.getModifiers
17. 通过反射机制 访问对象属性Field
18.
可变长参数:int... args
可变长度参数必须在参数列表中的最后一个,且只能有一个。
18. 反射Method(了解即可)
19. 通过反射机制怎么调一个对象的方法(重点!掌握掌握!!!)
.invoke()方法一定要记住