Java复习笔记+经验总结-06 多线程 泛型 反射

进程与线程: 进程是竞争计算机资源的基本单位, 线程是处理机调度的基本单位。进程是正在运行的程序, 是动态的。一个进程中包含多个线程。
注意:宏观上我们感觉多个线程并行执行, 其实是CPU时间片轮转的的结果, 线程(进程)在宏观上并行, 在微观上串行。

Java中线程的创建方式:
  1.继承Thread类, 重写run()方法。
  2.实现Runable接口。
注意: 实际上Thread类实现了Runable接口, 任何类在实现线程功能时候都必须实现该接口, 因为java语言是单继承, 一般情况下我们使用实现Runable接口使用线程。

注意: run()方法用于实现线程的功能, start()方法用于启动线程,如果在外部调用线程类的run()方法, 那么和调用普通方法没有什么区别。

线程生命周期:
这里写图片描述
  当线程start后,并不会立即执行, 应该进入就绪队列, 等待CPU的调度, 当CPU执行完一个任务或者时间片到时, 从就绪队列中调入线程执行。
线程优先级: Java中, 线程执行有不同的优先级, 范围是1~10, 默认是5, 可以使用Thread类中setPriority()方法设置。
注意: 范围必须是1~10,如果不在该范围, 将会抛出异常, 如果优先权相同, 那么采用轮流执行的方法。

线程挂起:
  1. thread.sleep(long millis)方法 : 该方法不会释放对象锁, 睡眠时间到自动唤醒。
  2.thread.join()方法: 该方法能够使当前执行的线程进入等待状态, 直到join()方法所调用的线程结束, 再恢复执行。
  3.wait()方法和notify()方法: wait()方法会释放对象锁, 需要和notify() / notifyAll()配合使用, wait()方法让线程进入“非可执行”状态, notify() / notifyAll()用于唤醒线程。
注意: wait(), notify(), notifyAll()这三个方法是Object类中的final方法, 可以被子类继承, 但不能被子类重写。

线程状态检查: thread.isAlive() 方法用于检查线程是否处于活动状态, 线程启动尚未终止, 则为活动状态。

后台线程(守护线程): thread.setDeamon(Boolean on) 用于设置线程为后台线程, 必须在线程启动前设置。使用thread.isDeamon()方法判断线程是否是后台线程。
注意: 后台线程在前台线程结束前被提前杀掉。

线程同步: 为了多个线程共享资源发生冲突, 需要在线程使用资源时给资源上一把锁。使多个线程并发执行时只有一个线程能使用该资源。java语言有两种同步方法, 即同步方法和同步代码块。
同步方法: 在方法声明处加 synchronized关键字。
如: synchronized void sum(){…}
  synchronized int max(){….}
同步代码块: 在方法中声明的同步区域
如 synchronized(Object someobject){
}
其中someobject是同步对象锁, 一般以当前对象作为同步对象锁。
注意: 同步是为了解决线程竞争同一目标资源而使用的, 使用同步机制, 使得该共享资源每次只能没一个线程使用。

线程通信: 可以使用 wait(), notify(), notifyAll()实现线程间的通信, 其中wait()方法让线程进入等待状态, notify()方法可以唤醒一个等待队列中的一个线程, notifyAll()方法可以唤醒所有线程。

线程死锁: 死锁即两个线程陷入永久互相等待状态。
死锁的必要条件:
  1. 互斥条件
  2.不可剥夺条件
  3.请求与保持条件
  4.循环等待条件
只要打破上述条件中的一个, 就可以防止死锁。

泛型: 泛型是JDK1.5中引入的一个新特性。泛型提供了编译时类型检查, 泛型的本质是将数据类型参数化。即泛型能够使类、接口、方法中的数据类型参数化。
泛型类:

public class Main<T>{
    private T data;

    public void setData(T data){
        this.data = data;
    }
    public T getData(){
        return data;
    }
}

使用泛型类:
 Main<String> main = new Main<String>();
 main.setData(“Hello”);

泛型接口:

public interface IMain<T>{
    public T getData();
}
使用泛型接口:
public class SubClass<T> implements IMain<T>{
    private T data;

    @Overrried
    public T getData(){
        return data;
    }
}

泛型方法:

public <T> void out(T t){
    System.out.println(t);
}

泛型上下限: 上限使用extends关键字, 下限使用super关键字。
如:

 public void fun(Student<? super String> stu){
    System.out.println(stu);
 }

这里 stu只能接收String 或 String 的父类, 下限是super。

注意:
 1. 如果限定了泛型, 那么只能添加String类型。
 2.添加的泛型不能是基本数据类型。
 3.泛型可以是自定义的字母或中文字符, 如 <中>等。
 4.extends 和 super分别表示泛型的上限和下限。

反射: 反射检测、修改本身状态或行为的一种能力。能够方便的创建灵活的代码, 在运行时装配, 反射使用不当会导致代价成本很高。

反射机制: 动态获取信息、动态调用对象方法的功能成为反射机制。
获取Class对象:
 1.对象名.getClass();
 2.类名.class
 3.Class.forName(“完整类名”);
注意: Class对象相当于类的一面镜子, 通过Class对象, 类可以具备检测和修改自己自身的能力。

注解: 注解(Annotation)是JDK1.5引入的新特性, 简单的说注解就是元数据, 即数据的数据。注解相当于一种标记, 在程序中加入了注解就等于为程序打上了某种标记。

JDK内部的提供的三个注解:
 1. @Deprecated 说明已经过时或者废弃的意思
 2.@Override 方法重写的意思
 3.@SuppressWarnings 警告保持静默
 
元注解: 4个标准meta-annotation, 负责注解其他的注解.
1.@Target
 @Target注解表示该注解标识到哪些成份上, 可能的值在枚举类ElementType中。如: ElementType.CONSTRUCTOR(构造器声明),
ElementType.METHOD(方法声明)等。
2.@Retention
 @Retention注解用于指明自定义注解的生命周期, 如:
RetentionPolicy.SOURCE(被编译器丢弃), Retention.CLASS(class文件中可用, 被JVM抛弃), Retention.RUNTIME(运行期保留, 可通过反射机制读取注解信息)
3.@Documented
 @Documented注解表明该注解应该被javadoc工具记录
4.@Inherited
 @Inherited一般被标注的类无法被继承, 使用该注解便可以被继承。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

longger_yang

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值