五、JAVA反射、线程

时间:2023-03-08 16:35:33
五、JAVA反射、线程

第五节:Java反射、线程

线程
1.进程:进程是程序的基本执行实体,进程是线程的容器。
   线程:被称为轻量进程,是程序执行流的最小单元。线程是进程中的一个实                 体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。
             线程是程序中一个单一的顺序控制流程
  多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程
五、JAVA反射、线程五、JAVA反射、线程
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方法启动线程
五、JAVA反射、线程五、JAVA反射、线程
        2.使用Runnable接口.
该类中的代码就是对线程要执行的任务的定义.
1:定义了实现Runnable接口
2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中
3:通过Thread类建立线程对象
4:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法
5:调用Thread类的start方法开启线程,并调用Runable接口子类run方法
package cn.itcast.gz.runnable;
public class Demo1 {
public static void main(String[] args) {
MyRun my = new MyRun();
Thread t1 = new Thread(my);
t1.start();
for (int i = 0; i < 200; i++) {
System.out.println("main:" + i);
}
}
}
class MyRun implements Runnable {
public void run() {
for (int i = 0; i < 200; i++) {
System.err.println("MyRun:" + i);
}
}
}

反射

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.五、JAVA反射、线程五、JAVA反射、线程
五、JAVA反射、线程