8.4java学习笔记

知识点

工厂模式

工厂模式可以减少代码的修改量

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

public class Factory {
    public static Person createPerson(){
        Person person = null;
        Properties p = new Properties();
        try {
            p.load(new FileInputStream("config.properties"));
            String clazzName = p.getProperty("person");
            Class clazz = Class.forName(clazzName);
            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;
    }

}
public interface Person {
    public void sleep();
}
public class Teacher implements Person {

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

}
public class Worker implements Person {

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

}
public class Test {

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

}
以下是需要解析的properties文件内容

person=com.chu.factoryModel.Teacher

反射

类Class概述

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

    /*
    * 反射
     */
    Class<Student> clazz = Student.class;
    //Field[] fields = clazz.getFields();//以数组形式返回所有公共属性
    /*Field[] fields = clazz.getDeclaredFields();//以数组形式返回所有属性
    for(Field field:fields){
        System.out.println(field.getName());//返回属性名称
        System.out.println(field.getType());//返回属性的类型
        System.out.println(field.getType().getName());//返回属性的类型名称
        System.out.println(field.getModifiers());//返回属性访问修饰符的整数表示形式
    }*/
    Student zhangsan = new Student();
    try {
        Field age = clazz.getDeclaredField("age");//得到指定的属性age
        age.setAccessible(true);        //取消java访问修饰符检查
        age.set(zhangsan, 19);      //将对象zhangsan的age属性的值更改为19
        age.setAccessible(false);   //取消  取消java访问修饰符检查
        System.out.println(zhangsan.getAge());//输出对象zhangsan的age值
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
public class Student {
    private String name;
    private int age;
    public String no;
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

注解

public class Teacher {
    private String name;
    private int age;
    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;
    }

}
建立一个注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)//表示此注解的范围是可执行的
@Target(ElementType.FIELD)//表示此注解只能用到属性上
public @interface ClazzAnotation {
    String name();
    int age() default 24;//如果age在注解中没有声明则使用默认default值
}
public class Clazz {
    @ClazzAnotation(name="张三",age=27)
    private Teacher javaTeacher;
    @ClazzAnotation(name="李四",age=22)
    private Teacher englishTeacher;
    @ClazzAnotation(name="王五")
    private Teacher mathTeacher;

    public Clazz() {
        Class clazz = this.getClass();
        Field[] fields = clazz.getDeclaredFields();//得到clazz的所有属性
        for(Field field:fields){
            ClazzAnotation ca = field.getAnnotation(ClazzAnotation.class);//得到clazzAnotation的注解,如果没有返回null
            if(ca==null){
                continue;//如果为null跳出
            }else{
                int age = ca.age();//得到该注解的age值,如果没有则赋默认值
                String name = ca.name();//得到该注解的name值
                Teacher teacher = new Teacher();
                teacher.setAge(age);
                teacher.setName(name);//根据注解的值创建新的对象
                try {
                    field.setAccessible(true);
                    field.set(this,teacher);//将这个teacher对象赋值clazz对象的该属性
                    field.setAccessible(false);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public Teacher getJavaTeacher() {
        return javaTeacher;
    }

    public void setJavaTeacher(Teacher javaTeacher) {
        this.javaTeacher = javaTeacher;
    }

    public Teacher getEnglishTeacher() {
        return englishTeacher;
    }

    public void setEnglishTeacher(Teacher englishTeacher) {
        this.englishTeacher = englishTeacher;
    }

    public Teacher getMathTeacher() {
        return mathTeacher;
    }

    public void setMathTeacher(Teacher mathTeacher) {
        this.mathTeacher = mathTeacher;
    }

}
public class Test {

    public static void main(String[] args) {
        Teacher teacher = new Clazz().getEnglishTeacher();
        Teacher teacher2 = new Clazz().getJavaTeacher();
        System.out.println(teacher.getName()+teacher.getAge());
        System.out.println(teacher2.getName()+teacher2.getAge());
    }
}

多线程

Thread()
public class MyThread extends Thread{
    private static int ticketNum = 50;
    private String lock = "lock";
    public MyThread() {

    }
    public MyThread(String name) {
        super(name);
    }
    @Override
    public void run() {
        while (ticketNum>0) {
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(lock){//线程锁
                System.out.println(this.getName()+"卖出第"+(ticketNum--)+"张票");
            }
        }
    }
}
public static void main(String[] args) {
    new MyThread("张三").start();
    new MyThread("李四").start();
    new MyThread("王五").start();
    new MyThread("赵六").start();
}

运行结果:
多线程

runnable方式
public class Myrunnable implements Runnable{
    private int ticketNum = 50;
    private String lock = "lock";
    public void run() {
        while (ticketNum>0) {
            while (ticketNum>0) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //运行结果的最后会出现卖出负数张票,是因为当ticketNum=0时,还有线程还在线程锁处等候,直至它们全部执行完,倒置票数仍在减少
                synchronized(lock){
                    System.out.println(Thread.currentThread().getName()+"卖出第"+(ticketNum--)+"张票");
                }
            }
        }
    }
}
setPriority()与join两种方法

概述:
public final void join()
throws InterruptedException等待该线程终止。

抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除
若带参数:
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
参数:
millis - 以毫秒为单位的等待时间。
nanos - 要等待的 0-999999 附加纳秒

    new MyThread("张三").start();
    Myrunnable myrunnable = new Myrunnable();
    Thread t1 = new Thread(myrunnable,"张三");
    Thread t2 = new Thread(myrunnable,"李四");
    Thread t3 = new Thread(myrunnable,"王五");
    Thread t4 = new Thread(myrunnable,"赵六");
    t1.start();
    t2.setPriority(10);//setPriority()方法用于设置优先级,参数越大优先级越高,优先级范围:1~10
    try {
        t1.join();//join()是指知道调用该方法的线程执行完再往下执行主线程,如果里面带参数,则是指执行多少毫秒后再往下执行
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("运行结束");
死锁的写法
public class MyRunnable1 implements Runnable{
    private String key1 = "key1";
    private String key2 = "key2";
    @Override
    public void run() {
        synchronized (key1) {
            System.out.println(Thread.currentThread().getName()+"进了room1,持有第一把钥匙");
            try {
                System.out.println(Thread.currentThread().getName()+"要睡觉了");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"醒了,他需要第二把钥匙");
            synchronized(key2){
                System.out.println(Thread.currentThread().getName()+"进了room2,持有第二把钥匙");
            }
        }
    }
}
public class MyRunnable2 implements Runnable{
    private String key1 = "key1";
    private String key2 = "key2";
    @Override
    public void run() {
        synchronized (key2) {
            System.out.println(Thread.currentThread().getName()+"进了room2,持有第一把钥匙");
            try {
                System.out.println(Thread.currentThread().getName()+"要睡觉了");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"醒了,他需要第一把钥匙");
            synchronized(key1){
                System.out.println(Thread.currentThread().getName()+"进了room1,持有第二把钥匙");
            }
        }
    }
}
public class Test {

    public static void main(String[] args) {
        MyRunnable1 myRunnable1 = new MyRunnable1();
        MyRunnable2 myRunnable2 = new MyRunnable2();
        new Thread(myRunnable1, "张三").start();
        new Thread(myRunnable2, "李四").start();
    }

}

运行结果:
死锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值