生产者消费者,单例和反射

生产者消费者,单例和反射

  1. 线程的生存周期

  2. wait() 和 notify() 方法

    wait()和notify()方法都是Object类中的方法

    wait()
    1. 让调用该方法的线程进入一个阻塞状态
    2. 需要通过对象调用,而且一般都是【锁对象】
    3. 【线程进入阻塞状态,会开启当前使用的锁对象】

    notify()
    1. 获取一个线程
    2. 也是需要通过对象调用,而且一般都是【锁对象】
    3. 【唤醒其他线程,并且开启锁对象】

  3. 生产者和消费者【线程通信】

3.1 生活实际案例分析

匹克 态极

生产者是 Peck 匹克
消费者是 骚磊
	
	消费者需要购买,结果没货,我需要进入等待状态。
	生产者进入生产状态,匹克开始加班加点!!!
	生产好了,告知消费者可以购买,给我发货
	我进入准备收货状态。

3.2 生产者消费者图例

3.3 需要解决的问题

1. 如何让商品成为两个线程的共享资源
	创建商品类对象,在消费者和生产者中定义一个成员变量,同时保存商品类对象的空间首地址,这里可以使用构造方法来完成。
	
2. 两个线程没有使用锁,会导致代码错乱,如何选择锁对象
	选择商品作为锁对象

3. 出现了死锁!!!!
	因为生产者进入生产状态之后,并没有从线程代码中运行结束处理,没有打开锁!!!

4. 使用notify和wait完成线程之间的通信
	这两个方法,都可以开锁!!!
  1. 反射【重点】

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,
	就可以使用暴力反射内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值