2020-12-28
线程池
没有线程池的情况:手动创建线程对象,如果线程都是执行一些简单的任务,这个任务需要有多个线程来完成。需要自己创建多个线程,创建多个线程的过程效率太低,时间都花费在创建和销毁上面
有线程池的情况:不需要手动创建线程对象,线程池中维护了一些活跃的线程;线程的创建和销毁都是线程池来完成。活跃的线程随时可以使用线程池中的线程来执行任务
线程池的创建
Java.util.concurrent 这个包下面有一个创建线程池的工具类
在包中的一些类型都是用于创建线程池的类型:
ExecutorService、ThreadFactory
其中我们关注ExecutorService 执行器服务
这个类型可以作为一个创建线程池方法的返回接口类型。
创建线程池的方法:
1、newFixedThreadPool(int nThreads)创建一个指定数量线程的线程池
2、newSingleThreadExecutor()创建只有一个线程的线程池
返回值是一个ExecutorService接口,不用关注实现类直接使用接口中的方法就可以了。
操作线程池的方法:
submit()提交任务的方法,里面要new一个Runnable接口
shutdown()关闭线程池:在关闭之前提交的任务,一定会帮你完成;在结束之后提交的任务就不再执行
shutdownNow()关闭线程池:在关闭之前如果还有任务没有执行,就不在执行了直接关闭线程池,将没有完成的任务作为返回值封装在一个list集合中
线程池的注意事项:
1、可以执行大于线程数量的任务,没有被分配到线程的任务,排队等待线程的空余,然后执行剩余的任务
2、线程池不会自己结束,没结束之前线程池的线程都是活跃状态,随时等待继续提交任务
3、安全性:在线程池中如果有线程挂掉,线程池总能保证线程的数量
4、效率方面线程池维护的线程都是活跃的可以直接拿来用,线程池中的操作效率优于手动创建
java8接口的特性
1、jdk7里面的接口只能有抽象方法,不能存在非抽象的方法,必须要用abstract修饰方法
2、jdk8接口中的方法可以是抽象的也可以是非抽象,如果更新平台,不会要求一定重写里面的所有方法。非抽象方法必须要用default和static修饰,方法必须要有方法体,可以不用重写。
default关键字
机制:在接口中方法声明上加上default关键字,这个方法就可以不被重写,必须有自己的方法实现。
使用:实现一个接口,这个接口中有抽象方法也有非抽象方法
在使用时的特殊情况:
1、在两个接口中有相同的抽象方法,必须重写抽象方法
2、两个接口中都有相同的非抽象方法。一个实现类实现这两个接口,一定要求重写其中一个中的方法
3、如果要选择一个默认的实现方式,在实现的接口中选择一个来继承,接口名.super.方法名()
4、一个实现类实现一个接口又继承了一个父类,那么接口和父类中有着相同的非抽象方法。即使是一个抽象类,优先考虑继承的是父类
接口:扩展
父类:核心
抽象方法需重写,非抽象方法不需要重写
影响:
1、接口的功能更加完善;
2、接口更加的向抽象类靠拢,实际上是强化了接口削弱了抽象类
Static
含义:可以在接口中使用static关键字定义静态方法,可以有自己的方法实现。
使用:直接用接口名调用方法即可。
注意事项:
1、static和abstract不能一起使用
原因:静态方法可以不用实现类对象调用直接使用接口调用;抽象方法需要对象来调用。静态方法如果没有实现,那么就会造成在运行阶段的安全隐患
2、static修饰的方法不能使用实现类的对象调用
原因:如果可以调用那么一个实现类可以实现多个接口,不能确定要调用哪个接口中的方法,会造成安全隐患。
lambda表达式
本质:就是用特殊的形式表示一个对象,一个实现类的对象
前提:
1、必须要实现一个接口
2、这个接口一定是一个函数式接口(只有一个抽象方法的接口)
好处:
1、对于开发者而言可以提升开发效率
2、更加能够将核心的功能突出,阅读效率也提高了
lambda格式的详细介绍
格式:
()->{};
():在实现类中重写方法的参数列表:不用去关注参数名称,也不用去关注参数类型,只需要确定参数的个数。
->:lambda运算符:这个运算符没有别的运算功能,只是将前后两个部分分隔,就是一个分隔符,没有别的含义
{}:方法体:重写方法的方法体需要写在大括号中,也成为Lambda体
特殊情况:
1、如果参数只有一个,可以将小括号省略;
2、如果方法体中的语句只有一句,可以将大括号还有分号省略
3、如果方法体中只有一句,并且是返回语句,可以将return、大括号、分号省略
如果需要省略内容,就需要将这三个部分全部省略,不然会报错
函数式接口的介绍
含义:
1、只有一个抽象方法的接口
2、是使用lambda表达式的前提
格式:
注解:@FunctionalInterface
检查是否是函数式接口的注解,如果是就编译通过,如果不是编译不通过
学习过的函数式接口:Runable Comparator