讲讲红黑树 他的优势是什么
根节点是黑色的
叶子节点是黑色的,叶子节点不存数据
红色节点的子节点和父节点是黑色的
任意节点到达叶子节点的所有路径都包含相同黑色节点
优点:插入和删除时,时间复杂度是O(logN)
实现一个线程的方法有哪些
继承Thread
类,实现Runnable
接口
启动一个线程的方法有哪些 调用start后会立即执行吗 终止线程的方法
调用start
方法
不会,线程只是处于就绪状态,得到CPU
时间片后才会执行
关闭线程:
volatile
:定义一个标志位exit
,默认值为false
,但exit
为true
时,while
循环就会退出,使用volatile
修饰这个标志位,目的是保证同一时刻只能一个线程修改exit
stop
:强制关闭,类似把台式机电脑电源拔了,电脑立刻关机,不按正常程序关机,会发生不可预料的事情interrupt
:给线程通知可以停止了,但是线程拥有自主选择权利,可以立刻终止,也可以多一段时间终止,也可以不终止,线程处于阻塞状态,会抛出异常,捕获异常后退出,非阻塞状态,处于运行状态的不受影响,仅仅标记线程的中断为true
,用isinterrupt
方法判断是否中断
关闭线程池:
shutdown
:关闭,但是关闭前提是正在运行的任务执行完,还有在等待队列的任务执行完shutdownNow
:和shutdown
主要区别在于now
,立刻关闭,不管正在运行和等待队列的任务
如何创建线程池 使用Executors能创建哪些类型的线程 ThreadPoolExecutor核心参数参数 拒绝策略有哪些
创建线程池:有两种方式,使用Executor
或ThreadPoolExecutor
Executor
:有六种类型的线程池
newFixedThreadPool
:创建固定大小的线程池newCacheThreadPool
:创建可缓存的线程池newSingleThreadExecutor
:创建单线程的线程池newScheduleThreadPool
:创建有延迟的线程池newSingleThreadScheduleExecutor
:创建单线程有延迟的线程池newWorkStrealingPool
:创建抢占式的线程池
ThreadPoolExecutor
核心参数参数:7个
corePoolSize
:核心线程数量maximumPoolSize
:总线程数量,即核心线程已满,并且队列已满,此时创建新线程个数(外包)=总线程数量-核心线程数量keepalivetime
:新线程生存时间(外包生存时间)TimeUnit
:设置keepalivetime
单位workQueue
:工作队列factory
:创建线程的工厂Handler
:拒绝策略
Handler
:常见有四种
abortpolicy
:默认,直接抛出异常discardPolicy
:丢弃新任务discardOldestPolicy
:丢弃队列旧的任务CallerRunsPolicy
:只由调用者所在的线程执行任务
引导讲了 一下SpringBoot的自动装配底层源码
通过扫描meta-inf
下的spring.factories
,找到键为autoconfigure.EnableAutoConfiguration
类,然后自动配置该键对应的值
具体实现是通过AutoConfigurationImportSelector
类,该类实现ImportSelector
接口,重写SelectImport
方法,在selectImport
方法里调用getAutoConfigurationEntry
方法
springboot
还提供了@ConditionalXXX
注解,可以对自动配置类进行过滤,满足条件的才能装配,这个注解使自动配置更加灵活
Spring里事务的传播属性 讲编程式事务和声明式事务
事务的传播:例如事务A
调用事务B
,事务A
有无事务对B
有影响,同理B
也一样影响A
,这个影响是什么就由两个事务之间定义的事务传播类型所决定
7
种事务传播属性:
require
:一定要有事务,如果当前有事务,则加入事务,如果没有则创建新事务require-new
:一定要创建新事务,有事务挂起support
:当前有事务,则加入事务,没有则以非事务执行support-not
:当前有事务则挂起,以非事务执行never
:有事务报错,以非事务执行nested
:当前有事务,则嵌套,没有事务则创建新事务mandatory
:强制性的,强制加入当前事务,当前有事务,则加入事务,没有则报错
编程式事务:通过编写代码来实现事务,缺点需要自己手动开启、提交或回滚事务,增加代码的复杂度
声明式事务:通过注解或配置来实现事务,相比编程式事务优点是业务代码和事务分离,降低代码复杂度,缺点是事务控制粒度只能作用在方法上,方法级别,而编程式事务是代码块级别