文章目录
简介
- 本文是2021/04/19整理的笔记
- 赘述可能有点多,还请各位朋友耐心阅读
- 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进
简答题
练习1
题目:
任务分为哪两种类型,其中反复任务有什么需要注意的?
答案:
任务分为定时任务和反复任务,反复任务需要注意任务之间的时间间隔计时开始时间(一种策略是从上一次任务开始时计时,另一种策略是从上一次任务结束后开始计时)
练习2
题目
Timer和TimerTask是什么关系?
答案
Timer是Java最早提供的一个任务调度器,它可以支持定时任务和重复任务的调度,如果希望借助于Timer进行任务调度,必须要满足Timer对任务本身的抽象规定,从刚才的Timer调度方法列表中可以看出,所有的方法第一个共同的参数均为TimerTask的对象,用于声明需要调度的任务中需要执行的指令代码
练习3
题目
Timer和ScheduledThreadPoolExecutor有什么区别?
答案
一个Timer调度器的所有任务都运行在一个线程中,存在单个任务出现异常导致所有任务不能执行的隐患,而JDK5之后的ScheduledThreadPoolExecutor提供了并发任务调用,不存在这个隐患
练习4
题目
JDK5+可以利用Executors构建哪些种类的任务调度器?
答案
ExecutorService newFixedThreadPool(int nThreads) 创建固定数目线程的线程池
ExecutorService newCachedThreadPool() 创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程
ExecutorService newSingleThreadExecutor() 创建一个单线程化的Executor,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类
练习5
题目
在Java中Lock接口比synchronized块的优势是什么?
答案
lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,他的作用类似与synchronized,但是提供了更清晰的语义
练习6
题目
ThreadLocal的作用是什么?
答案
- ThreadLocal用来解决多线程程序的并发问题
- ThreadLocal并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.
泛型通配符
通配符基本使用
ArrayList<?> list;
list = new ArrayList< String >( );
list.add(“Hello”); //报错
list = new ArrayList< Integer >( );
list.add(3); //报错
list.add(null);
因为null是所有类的成员
通配符高级使用----受限泛型
泛型的上限
格式: 类型名称<? extends 类> 对象名称
意义: 只能接收该类型及其子类
public class Test {
public static void main(String[] args) {
//创建4种泛型的ArrayList对象
Collection<Integer> list1 = new ArrayList<>();
Collection<String> list2 = new ArrayList<>();
Collection<Number> list3 = new ArrayList<>();
Collection<Object> list4 = new ArrayList<>();
getElement(list1);
// getElement(list2);
getElement(list3);
//getElement(list4);
}
public static void getElement(Collection<? extends Number> collection){
}
}
泛型的下限
格式: 类型名称<? super 类> 对象名称
意义: 只能接收该类型及其父类
public class Test {
public static void main(String[] args) {
//创建4种泛型的ArrayList对象
Collection<Integer> list1 = new ArrayList<>();
Collection<String> list2 = new ArrayList<>();
Collection<Number> list3 = new ArrayList<>();
Collection<Object> list4 = new ArrayList<>();
//getElement(list1); 报错
//getElement(list2); 报错
getElement(list3);
getElement(list4);
}
public static void getElement(Collection<? super Number> collection){
}
}
反射
- Class类对象
- Field成员变量对象
- Method方法对象
- Constructor构造器对象
反射的概念
在运行过程中,对于任意一个类,都知道它的所有属性和方法;对于任意一个对象,都能通过它调用任意的属性和方法,这种动态获取信息以及动态调用对象的方法的功能就是Java的反射机制。
什么叫做Java语言的动态性
Java 反射机制是 Java 语言的一个重要特性,使得 Java 语言具备“动态性”:
- 在运行时获取任意一个对象所属的类的相关信息;
- 在运行时构造任意一个类的对象;
- 在运行时获取任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
反射的作用
- 在程序运行过程中,可以对Class类对象 Field类对象 Method类对象 Constructor构造器对象进行操作。
- 降低代码的耦合性,增加程序的扩展性。
反射API包括什么
- java.lang.Class类:代表一个类
- java.lang.reflect.Field类 类的属性
- java.lang.reflect.Method类 类的成员方法
- java.lang.reflect.Constructor类 类的构造方法
- java.lang.reflect.Array类 动态创建数组,以及访问数组的元素的静态方法。
Class类的作用
获取Class类对象的方式
1.Class.forName();参数为类所在路径
- 此方法适用于Source源代码阶段
2.类名.Class
- 对应Class类对象阶段
3.对象.getClass
- getClass是Object类的方法,所以所有对象都可以调用这个方法。
- 对应Runtime运行期阶段
单元测试
unit Test 针对类的方法进行测试
使用步骤:
@Test //引入单元测试的注解
pubic void testXXX(//不传参){
测试代码
}