生产者消费者,单例和反射
-
线程的生存周期
-
wait() 和 notify() 方法
wait()和notify()方法都是Object类中的方法
wait()
1. 让调用该方法的线程进入一个阻塞状态
2. 需要通过对象调用,而且一般都是【锁对象】
3. 【线程进入阻塞状态,会开启当前使用的锁对象】notify()
1. 获取一个线程
2. 也是需要通过对象调用,而且一般都是【锁对象】
3. 【唤醒其他线程,并且开启锁对象】 -
生产者和消费者【线程通信】
3.1 生活实际案例分析
匹克 态极
生产者是 Peck 匹克
消费者是 骚磊
消费者需要购买,结果没货,我需要进入等待状态。
生产者进入生产状态,匹克开始加班加点!!!
生产好了,告知消费者可以购买,给我发货
我进入准备收货状态。
3.2 生产者消费者图例
3.3 需要解决的问题
1. 如何让商品成为两个线程的共享资源
创建商品类对象,在消费者和生产者中定义一个成员变量,同时保存商品类对象的空间首地址,这里可以使用构造方法来完成。
2. 两个线程没有使用锁,会导致代码错乱,如何选择锁对象
选择商品作为锁对象
3. 出现了死锁!!!!
因为生产者进入生产状态之后,并没有从线程代码中运行结束处理,没有打开锁!!!
4. 使用notify和wait完成线程之间的通信
这两个方法,都可以开锁!!!
- 反射【重点】
4.1 反射原理
4.2 获取Class类对象
static Class forName(String className);
通过Class类名调用,是一个static修饰的静态方法,传入的参数是一个完整的包名.类名
例如:
Demo1 ==》 com.qfedu.a.Demo1
该方法有异常抛出 ClassNotFoundException
Class 类名.class
通过指定的类名调用,获取类对应的属性
Class 类对象.getClass();
通过类对象,获取对应当前类对象的class, Class类对象
4.3 获取Constructor类对象
Constructor[] getConstructors();
获取当前类内所有非私有化构造方法Constructor数组
Constructor[] getDeclaredConstructors();
获取当前类内的所有构造方法Constructor数组,包括私有化构造方法
Constructor getConstructor(Class... initParameterType);
根据指定的参数类型,获取指定的非私有化构造方法类对象, Constructor
Class... 首先这里要求的数据类型是Class类对象,而且当前参数的个数不确定
可以不传入参数,也可以传入多个Class类型的参数。
Constructor getDeclaredConstructor(Class... initParameterType);
根据指定的参数类型,获取指定的构造方法类对象,包括私有化构造方法。
Class... 这里是一个不定长参数,需要的参数类型是Class类对象,个数不限!!!
Object newInstance(Object... initParameter);
通过Constructor类对象调用,传入参数是当前构造方法,创建对象所需的实际参数。
4.3 获取Method类对象
Method[] getMethods();
获取当前类内所有的非私有化成员方法,包括从父类继承而来的可以在子类使用的成员方法
Method[] getDeclaredMethods();
获取当前类内的所有方法,但是不包括从父类继承而来方法
Method getMethod(String methodName, Class... parameterTypes);
获取类内指定方法名和参数类型的非私有化成员方法
String methodName: 指定的方法名字
Class... parameterTypes 当前方法参数类型的Clas类对象,不定长参数
Method getDeclaredMethod(String methodName, Class... parameterTypes);
获取类内指定方法名和参数类型的成员方法,包括私有化方法
String methodName: 指定的方法名字
Class... parameterTypes 当前方法参数类型的Clas类对象,不定长参数
Object invoke(Object obj, Object... args);
Object obj 调用当前方法的类对象
Object... args 执行当前方法需要的实际参数列表
4.4 获取Field类对象
Field[] getFields();
获取当前类内的所有非私有化成员变量类对象,返回的是一个Field类型数组
Field[] getDeclareFields();
获取当前类内的所有成员变量,包括私有化成员变量,返回的是一个Field类对象数组
Field getField(String fieldName);
通过指定成员变量的名字。获取指定的成员变量类对象,但是不能获取私有化成员变量
Field getDeclaredField(String fieldName);
通过指定的成员变量名字。获取指定的成员变量类对象,而且可以获取私有化成员变量
void set(Object obj, Object value);
Object obj 是操作当前成员变量的类对象
value 是给予当前成员变量的值
Object get(Object obj);
Object obj 指定获取哪一个类对象中成员变量数据
给予暴力反射操作权限
void setAccessible(boolean)
暴力反射获取的内容,默认情况下类外没有操作权限,如果调用当前方法,传入参数为true,
就可以使用暴力反射内容