快捷搜索: 长连接 前端 源码 pan

第五节:Java反射、线程 线程

第五节:Java反射、线程 线程

1.进程:进程是程序的基本执行实体,进程是线程的容器。 线程:被称为轻量进程,是程序执行流的最小单元。线程是进程中的一个实 体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。 线程是程序中一个单一的顺序控制流程 多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程 2.锁: Lock API: lock():获取锁,如果锁被暂用则一直等待 unlock():释放锁 tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间 lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的 3:Lock和synchronized有以下几点不同: Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;   synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;   Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;   通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。   Lock可以提高多个线程进行读操作的效率 4:线程操作: notify:唤醒线程池中某一个等待线程。 notifyAll:唤醒的是线程池中的所有线程。 wait: 将线程处于冻结状态,释放了执行权和资格。 sleep:将当前线程进入阻塞状态 5:wait和sleep区别(从执行权和锁来分析): wait不一定指定时间。 sleep:必须指定时间,时间到自动从冻结状态转成运行状态 wait:线程会释放执行权,而且线程会释放锁。 Sleep:线程会释放执行权,但不是不释放锁。 6:方法:java.lang.Thread Thread(String name):初始化线程的名字 getName():返回线程的名字 setName():设置线程对象名 interrupt():中断线程。 setPriority(int newPriority):更改线程的优先级。(虽设置了优先级,但是具体的实现取决于操作系统的实现,最大优先级10,最小1,默认是5 ) getPriority():返回线程的优先级,默认优先级是5。 toString():返回该线程的字符串表示形式,包括线程名称,优先级和线程组。 Thread.yield():暂停当前正在执行的线程对象,并执行其他线程。 setDaemon(true):将该线程标记为守护线程或用户线程。 join:临时加入一个线程的时候可以使用join方法。 current Thread():返回CPU正在执行的线程的对象 7.线程状态: 创建 可运行 运行 阻塞 死亡 8.创建线程: 1.继承Thread,复写run方法,把要执行的任务放在run方法中,调用start方法启动线程 2.使用Runnable接口. 该类中的代码就是对线程要执行的任务的定义. 1:定义了实现Runnable接口 2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中 3:通过Thread类建立线程对象 4:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法 5:调用Thread类的start方法开启线程,并调用Runable接口子类run方法 备注:suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态

反射 1.反射:动态加载一个指定的类,并获取该类中的所有的内容。 反射就是把java类中的各种成分映射成一个个的Java对象 获取对象的属性、方法 反射的好处:大大的增强了程序的扩展性。

2.Java反射示例: Method [] methods = MyObject.class.getMethods(); for(方法方法:方法){ System.out.println(“method =”+ method.getName()); } 3.步骤: 1、获得Class对象(获取到指定的名称的字节码文件对象) 调用某个对象的getClass()方法 Person p=new Person(); Class clazz=p.getClass(); 调用类的class属性来获取该类对应的Class对象 Class clazz=Person.class; 使用Class类中的forName()静态方法; (最安全/性能最好) Class clazz=Class.forName(“类的全路径”); 2、实例化对象,获得类的属性、方法或构造函数。 //获取Person类的所有方法信息 Method[] method=clazz.getDeclaredMethods(); //获取Person类的所有成员属性信息 Field[] field=clazz.getDeclaredFields(); //获取类的所有构造方法信息 Constructor[] constructor=clazz.getDeclaredConstructors(); 3、两种创建对象的方法。 ①newInstance()创建类的实例 Person p=(Person) clazz.newInstance(); //创建对象 p.setName(“张三”); //设置属性 ②先使用Class对象获取Constructor对象, 再调用newInstance()创建类的实例 //获取构造方法 Constructor c = clazz.getDeclaredConstructor(String.class,String.class,int.class); //创建对象并设置属性 Person p1=(Person) c.newInstance(“李四”,“男”,20); 4: 1.我们在对类进行检查之前,需要获取类对象。获得Class对象: ①编译时知道类名称: 类myObjectClass = MyObject.class; ②编译时不知道名称,在运行时将类名作为字符串 Class class = Class.forName(className); 2.类对象 class myObjectClass = MyObject.class;//得到Java类对象 3.类名称 String className = aClass.getName();//获取类名 4.类修饰符 int modifiers = aClass.getModifiers();//获取类修饰符 5.包信息 package = aClass.getPackage();//获取有关包的信息: 6.超类Class superclass = aClass.getSuperclass();//获取超类 7. 构造函数 Constructor [] constructors = aClass.getConstructors();//访问构造函数 8.接口列表 Class [] interfaces = aClass.getInterfaces(); //获取接口列表 9.方法 Method [] method = aClass.getMethods();//访问方法 10.变量 Field [] method = aClass.getFields();//访问变量 11.注解 Annotation [] annotations = aClass.getAnnotations(); //访问注解 5:java反射–属性 1.Field [] fields = aClass.getFields();//获得类中所有public的方法 2.Field field = aClass.getField(“someField”); //根据变量名得到public变量 Field getDeclaredField(String name) //根据方法名获得public和非public变量 Field[] getDeclaredFields() //获得类中所有的public和非public方法 3.String fieldName = field.getName();//获取变量名称 4.Object fieldType = field.getType();//获取变量类型 5.获取和设置变量值 Object value = field.get(objectInstance); field.set(objetInstance,value); 6.

经验分享 程序员 微信小程序 职场和发展