Java面试题(8)

讲讲红黑树 他的优势是什么

根节点是黑色的

叶子节点是黑色的,叶子节点不存数据

红色节点的子节点和父节点是黑色的

任意节点到达叶子节点的所有路径都包含相同黑色节点

优点:插入和删除时,时间复杂度是O(logN)

实现一个线程的方法有哪些

继承Thread类,实现Runnable接口

启动一个线程的方法有哪些 调用start后会立即执行吗 终止线程的方法

调用start方法

不会,线程只是处于就绪状态,得到CPU时间片后才会执行

关闭线程:

  1. volatile:定义一个标志位exit,默认值为false,但exittrue时,while循环就会退出,使用volatile修饰这个标志位,目的是保证同一时刻只能一个线程修改exit
  2. stop:强制关闭,类似把台式机电脑电源拔了,电脑立刻关机,不按正常程序关机,会发生不可预料的事情
  3. interrupt:给线程通知可以停止了,但是线程拥有自主选择权利,可以立刻终止,也可以多一段时间终止,也可以不终止,线程处于阻塞状态,会抛出异常,捕获异常后退出,非阻塞状态,处于运行状态的不受影响,仅仅标记线程的中断为true,用isinterrupt方法判断是否中断

关闭线程池:

  1. shutdown:关闭,但是关闭前提是正在运行的任务执行完,还有在等待队列的任务执行完
  2. shutdownNow:和shutdown主要区别在于now,立刻关闭,不管正在运行和等待队列的任务

如何创建线程池 使用Executors能创建哪些类型的线程 ThreadPoolExecutor核心参数参数 拒绝策略有哪些

创建线程池:有两种方式,使用ExecutorThreadPoolExecutor

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:强制性的,强制加入当前事务,当前有事务,则加入事务,没有则报错

编程式事务:通过编写代码来实现事务,缺点需要自己手动开启、提交或回滚事务,增加代码的复杂度

声明式事务:通过注解或配置来实现事务,相比编程式事务优点是业务代码和事务分离,降低代码复杂度,缺点是事务控制粒度只能作用在方法上,方法级别,而编程式事务是代码块级别

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值