线程池_java8特性(抽象非抽象)_lambda_函数式接口

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值