多线程、反射

一、相关概念
1.并发与并行
并行:同一时刻,俩件事情同时发生
并发:同一微小时间段内,同时发生多件事情,这是我们的主要研究对象
2.进程与线程
进程:系统为每个运行的程序以进程为单位分配独立的系统资源。进程就是一个程序运行过程的描述
线程:每个进程中一个最小执行单元,每个进程至少有一个线程,如果有多个线程,这个程序就是多线程程序
举例:JVM的运行是多线程的,JVM启动时至少有个main线程,还有一个垃圾回收线程是守护线程(后台线程)
3.多线程的优点:
提升cpu的利用率,提示程序的响应速度。
4.多线程的创建方式
A:继承Thread类
(1)写一个Thread的子类,并重写run方法
(2)创建子类对象
(3)调用start方法,启动线程
B:实现Runnable接口
(1)创建一个Runnable的实现类(线程任务类),重写run方法
(2)创建一个实现类对象
(3)创建一个Thread类对象,并通过构造器传入一个线程任务类对象
(4)调用start方法,启动线程
C:以上俩种创建方式的比较
A方式使用简单一些,但是有单继承的限制
B方式使用步骤稍微复杂一些,避免了单继承的限制,方便共享数据
5.Thread类
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
public static void sleep(long millis) :线程睡眠,使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public final void setPriority(int newPriority) :改变线程的优先级
public static void yield():线程礼让,yield只是让当前线程暂时失去执行权,让系统的线程调度器重新调度一次
void join() :加入线程,当前线程中加入一个新线程,等待加入的线程终止后再继续执行当前线程。
public void setDaemon(boolean on):将线程设置为守护线程或用户线程。必须在线程启动之前设置,否则会报 IllegalThreadStateException 异常。
public void interrupt():中断线程,实际上是给线程打上一个中断的标记,并不会真正使线程停止执行。
6.线程的生命周期
新建->就绪->运行->死亡
新建->就绪->运行->阻塞->就绪->运行->死亡
新建->就绪->运行->就绪->运行->死亡

在JDK当中定义了六种线程状态(了解)

7.线程安全问题
    安全问题出现的条件(原因):
        1.多线程
        2.共享数据
        3.有多条代码语句操作共享数据
    线程安全问题的解决:
        思路:把多条操作共享数据的语句,封装成一个整体。
        使用Synchronized关键字,可以实现此功能
        方式一:synchronized(同步锁){操作共享数据的多条代码语句}
        方式二:public synchronized void method(){可能会产生线程安全问题的代码}
    锁对象:
        可以是任意对象,一般使用this关键字,多个线程使用同一个锁对象
8.线程间通信
    多个线程共同完成一个任务,每个线程的任务不同,而且一个线程的任务执行需要根据另外一个线程的结果来决定是否执行。
    这时就需要一个线程执行完把结果通知给另外一个线程。要实现这种线程通信,通常使用等待唤醒机制 wait notify
    以上描述的例子就是经典的生产者消费者案例
9.死锁
    同步代码块使用不当,有可能出现一个线程需要使用的锁被另外一个线程使用并且未释放,反过来也是此情况,就很大概率出现死锁
    双方拿着对方需要的锁未释放
    一、类的加载
1.类的加载过程:要使用类就需要加载类
	1.加载-》2.连接(验证-准备(对静态变量设置初始默认值,给静态常量直接赋值)-解析)-》3.初始化(为静态变量设置初始化值,执行静态代码块)
	private static int num=3;
	static{ 静态代码块 }
2.什么操作会执行类的初始化?
	①运行main方法,main所在的类会初始化
	②使用类的静态成员(类变量、类方法)会导致类的初始化
	③new关键创建类的对象时
	④子类初始化,导致父类初始化
	⑤反射使用类的字节码对象时
3.什么情况不会导致类的初始化?
	①使用类的静态常量
	②使用子类继承的父类的静态成员时,仅执行父类的初始化,子类不初始化
	③仅使用类的类型创建变量,比如  Student s; Student[] arr=new Student[3];
4.类的加载器
	类通过类加载器完成加载
	①启动类加载器BootStrap CLass Loader
		加载jre核心类库,c++编写
	②扩展类加载器Ext Class Loader
		加载jre/ext的类,java编写
	③系统类加载器(应用类加载器)App Class Loader
		加载classpass路径下的类,java编写
	④自定义类加载
		用于加载指定目标的class,java编写
5.双亲委派机制
	低级的类加载器收到类的加载请求时,会向上级类加载器请求询问是否加载过,依次递归,如果没有加载,

依次从最高级类加载器询问是否可以加载,直到可以加载的类加载器将类加载,否则报错(类不存在)
好处?
①防止重复加载类
②安全需要,比如自己加载一个篡改过的String类
二、反射
1.java.lang.Class
类加载成功后,会在内存中创建一个类的字节码文件对象,这个对象就是Class类的实例,这个对象封装类的详细数据信息,
那么我们就可以通过这个字节码对象使用这个类,这种方式就是反射。
2.Class类的对象获取方式
①类名.class 任意java类型都支持此方式
②对象.getClass()
③Class.forName(“类的全路径名称”)
④类加载器对象.loadClass(“类的全路径名称”)
3.使用反射
Class clazz=Class.forName(“com.atguigu.User”);
①获取类的信息:构造器、属性、方法、修饰符、泛型、注解等等

	②使用构造器创建对象
		clazz.getConstructors();
		clazz.getDeclaredeConstructors();
		clazz.getConstructor(Class<T>... cl)
		Constructor clazz.getDeclaredeConstructor(Class<T>... cl)
		Object obj=contructor.newInstance();
	③使用属性赋值
		Field	clazz.getField()
		field.set(obj,value)
	④使用方法,调用方法
		Method clazz.getMethod()
		method.invoke(obj,param...)
	⑤使用注解
		Annotation clazz.getAnnotation();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值