注解,反射,多线程,死锁

这里写图片描述

注解

这里写图片描述

package com.Annotation2.android;

import java.lang.reflect.Field;

public class Clazz {
    @TeacherAnnotation(age=20,name="张三" )
    private Teacher javaTeacher;
    @TeacherAnnotation(age=20,name="李四")
    private Teacher englishteacher;
    @TeacherAnnotation(age=20,name="王五")
    private Teacher mathTeacher;

    private int clazzNum;
    private  String name;
    public Clazz(){
        Class clazz=Clazz.class;
        Field[] fields=clazz.getDeclaredFields();
        //得到clazz的所有属性
        for (Field field:fields ) {
            TeacherAnnotation ta=field.getAnnotation(TeacherAnnotation.class);
            //得到TeacherAnnotation注解,如果没有返回null
            if(ta==null){
                continue;//如果为null跳出
            }else{
                int age = ta.age();//得到注解的age值如果没有写默认值
                String name =ta.name() ;//得到注解的name值
                Teacher teacher=new Teacher();
                teacher.setAge(age);
                teacher.setName(name);//根据注解的值创建新的对象
                field.setAccessible(true);//设置为不检查属性的访问修饰符
                try {
                    //将这个teacher对象辅助给此班级对象的该属性
                    field.set(this, teacher);
                    //this指的是Student的对象
                    //将Student的对象的属性值修改为i
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                field.setAccessible(false);

            }
        }

    }
}
***********************************************************
package com.Annotation2.android;

import com.reflect.android.Person;

public class Teacher extends Person{
   public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
private  String name ;
   private int age ;
}
**************************************************************
package com.Annotation2.android;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TeacherAnnotation {
   int age()  default 19    ;//如果在get中注解中没有声明则使用默认值
   String name();
}

反射

工厂方法模式
这里写图片描述

package com.reflect.android;

public class Person {
     public void sleep(){
         System.out.println("人睡觉");
     }
}
*************************************************************
package com.reflect.android;

public class Student extends Person {

    @Override
    public void sleep() {
        System.out.println("学生睡觉");
    }

}
***************************************************************
package com.reflect.android;

public class Teacher  extends Person{

    @Override
    public void sleep() {
        System.out.println("老师睡觉");
    }

}
************************************************************
package com.reflect.android;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class Factory {

    public static Person creatPerson() {
        Person person = null;
        Properties p = new Properties();
        //Properties() 创建一个无默认值的空属性列表。
        //Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串
        try {// void load(InputStream inStream) 从输入流中读取属性列表(键和元素对) 
            p.load(new FileInputStream("config.properties"));
            // String getProperty(String key) 用指定的键在此属性列表中搜索属性。 
            String clazzName = p.getProperty("person");//Teacher
            //forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象
            Class clazz = Class.forName(clazzName);//Teacher.class
            //newInstance() 创建此 Class 对象所表示的类的一个新实例
            person = (Person) clazz.newInstance();
        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        } catch (InstantiationException e) {

            e.printStackTrace();
        } catch (IllegalAccessException e) {

            e.printStackTrace();
        }

        return person;

    }



}
******************************************
package com.reflect.android;

public class FactoryTest {

    public static void main(String[] args) {
        Person person=Factory.creatPerson();
       person.sleep();

    }

}

多线程

1继承thread

构造方法Thread(String name) 分配新的 Thread 对象。
String 类型 getName() 返回该线程的名称。

package com.thread.android;

public class ThreadTest extends Thread{

    public ThreadTest(){//无参构造器

    }
    public ThreadTest(String name){
        super(name);//有参构造器,名字
    }
    private int ticket=200;
    @Override
    public void run() {
        while(ticket>0){
            System.out.println(getName()+"卖出了"+ticket+"票");
            ticket--;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}
---------------------------------------------------------
package com.thread.android;

public class TrdTest {


    public static void main(String[] args) {
        ThreadTest t1=new ThreadTest("售票员1");
        //Thread有个有参构造方法可以添加名字
        ThreadTest t2=new ThreadTest("售票员2");
        ThreadTest t3=new ThreadTest("售票员3");
        ThreadTest t4=new ThreadTest("售票员4");

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

}

2

1- 实现接口Runnable 只有run方法
2- Thread.currentThread().getName()通过线程的当前线程方法获得线程再通过getName()方法得到线程名字

package com.thread.android;

public class RunnableImpl implements Runnable{
    int i=100;
    private String s="aas";
    @Override
    public void run() {
        while(i>0){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //线程锁
            synchronized (s) {
                //四个线程都在等待
                //线程1进去后i变为0进不入循环,但是还有三个线程在循环内部等,
                if(i>0){
                System.out.println(Thread.currentThread().getName()+"卖出的票号码是"+i);
                i--;
                }
            }

        }

        }

    }





-------------------------------------------------------
package com.thread.android;

public class Test {

    public static void main(String[] args) {
        RunnableImpl rb=new RunnableImpl() ;
        Thread td1=new Thread(rb, "售票员1");
        Thread td2=new Thread(rb, "售票员2");
        Thread td3=new Thread(rb, "售票员3");
        Thread td4=new Thread(rb, "售票员4");

         td1.start();
         td2.start();
         td3.start();
         td4.start();


    }

}

join


         td1.start();
//         td2.start();
//         td3.start();
//         td4.start();
         try {
            //td1.join();//必须等待该线程终止再往下运行
            td1.join(1000);//先运行1 秒  然后再往下
            System.out.println("运行结束");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

死锁

package com.thread1.android;

public class MyRunnable1 implements Runnable{
    private String lock1="1230";
    private String lock2="1224";
    @Override
    public void run() {
        synchronized (lock1){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }

            System.out.println("我在等待lock2");
        }
        synchronized (lock2) {

        }

    }




}
------------------------------------------------
package com.thread1.android;

public class MyRunnable2  implements Runnable{
        private String lock1="1230";
        private String lock2="1224";
        @Override
        public void run() {
            synchronized (lock2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }

                System.out.println("我在等待lock1");
            }
            synchronized (lock1) {

            }

        }




    }



----------------------------------------------------------
package com.thread1.android;

public class Test {

    public static void main(String[] args) {
        MyRunnable1 r1=new MyRunnable1();
        MyRunnable2 r2=new MyRunnable2();

        Thread t1=new Thread(r1,"张丹");
        Thread t2=new Thread(r2,"李四");

        t1.start();
        t2.start();

    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值