JDK1.8新特性
程序员文章站
2022-03-04 08:41:20
...
1.接口
回顾:只有方法签名,没有方法体
默认方法是public abstract修饰的
具体的方法的业务是其实现类做的
抽象方法,是必须被覆写的
可以new接口,使用匿名内部类,覆写抽象方法。
为什么要抽取接口?
面向接口编程,只需要管声明,有需求,传什么参数,返回对应的结果。
只有对业务熟悉,才会抽取规范的接口。
接口的抽象方法可以被继承或实现。
调用接口的方法:两种方式。new实现类或定义一个匿名内部类
接口中有方法体的方法:
静态方法:
接口的方法可以写方法体,只需要添加static修饰,但是static修饰的方法不能被覆写。不能被实现类调用,也不能被子类继承。只能使用类名进行调用。
用处:
default方法:
① 可以被实现类调用
② 能被子类继承并覆写
③
default的用处:接口 的方法的实现,每个实现内的方法体都是一样的,类似于抽取base类。并可以被覆写,实现特有的方法
需求增加一个功能,可以只改接口,面向接口编程
接口里写了方法体,所有的实现类和子类都有这个方法,都可以调用,不用再覆写
我们已经开放好功能了,需要增加需求功能,原始的方法是,接口定义一个抽象方法,每一个实现类覆写。现在,使用default,可以直接在接口中定义default方法体,实现类可以不用管。
函数式接口:
有且仅有一个抽象方法(Object类的public方法除外)
@FunctionInterface 打在接口上,表示此接口为一个显示的函数式接口
隐式函数式接口
lambda表达式:(基于函数式接口实现的)
如果函数体只有一句,且有返回值,{}和return可以一起省
如果只有一个参数,参数的()可以省
没有参数,需要使用()作为占位符
内部类中使用一个外部的变量,这个变量必须是final修饰的
同样lambda一样,
lambda可以替代匿名内部类
stream
线程和线程并发
1.线程和进程的区别?
进程是资源分配的最小单位
线程是程序执行的最小单位
一个进程可以有多个线程组成,多线程共享数据就会造成线程不安全问题。
解决线程安全问题,尽力避免资源共享问题。
2.创建线程的方式
继承Thread类
重写run方法,自己实现业务逻辑
使用start启动线程。
实现Runnable接口
覆写run方法,然后将
实现callable接口,需要返回值的时候,使用
实现call方法
要区别run和start,通过start启动起来。线程需要抢占CPU资源,获取到资源的时候,再运行
3.线程的生命周期(自己能画)
。
4.线程同步
只有多线程访问共同资源的时候,就会出现线程安全问题
解决方案就是:对资源进行加锁
synchronized
可以添加在方法和类上面。
不需要自己进行解锁
是JVM级别的,JVM发现有此修饰符会使用monitor进行监视,当monitor被占用的时候,就会被锁定。有此标签标示资源被占用。
Lock (属于concurrent包下的)
是java代码级别的,我们认为可以进行一个控制,使用完毕之后,需要手动释放锁。未放,就容易造成死锁。
尽量避免线程安全的问题,即 ①避免类级别的共享的变量。如:变量尽量是小范围的,避免使用类级别的变量。
②添加同步或锁,锁住资源
③使用ThreadLocal,解决多线程的并发安全问题(当前线程作为一个key,传入的值作为value,不同的key线程对应不同的value,实现了线程的隔离)
内部使用的是map来存取,为每个线程创建一个副本,map内部存放的的是,每一个线程进入都会创建了一个map,通过map就将线程之间隔离开了。获取资源的时候,通过map内部的key,获取对应的value
。
5、线程池
在excutor内上面,注意有些0,表示是没有限制
上一篇: ubuntu设置允许root用户登录
下一篇: 简单的网络爬虫的python实现