String s = " ";
1. String类的常用方法有哪些?
- s.length(): 返回字符串长度
- s.substring(): 截取字符串
- s.split(): 分割字符串
- s.equlas(): 字符串比较
- s.chatAt(): 返回指定索引处的字符
2. 说一下synchronized底层实现原理
答:它底层是由monitor实现的,monitor是jvm级别的对象(使用c++编写的),线程获得锁需要用对象关联monitor。 monitor有三个属性:owner, entrylist, waitset.
其中:owner是关联获得锁的线程,并且只能关联一个线程,而entrylist是关联处于阻塞状态的线程,waitset是关联处于等待状态的线程
3.线程池的七个参数是什么?执行原理是什么?
答:七个参数:
1. 核心线程数
2.最大线程数
3.线程存活时间
4.线程存活时间的单位
5.工作队列
6.线程工厂
7.拒绝策略
执行原理:当一个任务来了之后,会先去判断一下核心线程数是否已满,如果没有满,直接添加到工作线程去执行,如果已经满了,则添加到阻塞队列,如果阻塞队列也满了,则判断是否达到最大线程数,如果没达到,则创建临时线程来执行,如果已经达到了最大线程数,那就直接根据拒绝策略来拒绝。
4.线程池有哪些常见的阻塞队列?
BlockingQueue有这几种类型:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、DelayedWorkQueue。
5. 线程池有哪些种类?
在JUC包下有Excutors类中提供了很多创建连接池的静态方法,常见的有四种:
1. newFixedThreadPool(int nThreads)
特点:
- 核心线程数 == 最大线程数
- 阻塞队列使用的是LinkedBlockingQueue
- 适用于任务数已知,比较耗时的任务
2. newSingleThreadExcutors()
特点:
- 核心线程数 == 最大线程数 == 1 (单线程)
- 阻塞队列使用的是LinkedBlockingQueue
- 适用于按照顺序执行的任务
3. newCachedThreadPool()
特点:
- 核心线程数 == 0
- 最大线程数 == Integer.MAX_VALUE
- 阻塞队列为synchronousQueue
- 适用于任务数比较密集,而且任务耗时比较短的情况(防止任务太多时,任务耗时太长,创建大量的线程占用内存)
4. newScheduledThreadPool
特点:创建一个可执行延时任务的线程池,支持定时及周期性任务执行
6.谈谈对ThreadLocal的理解
答:1.ThreadLocal可以实现资源对象的线程隔离,让每个线程各用各的资源对象,防止产生线程安全问题
2.ThreadLocal也实现了线程内的资源共享。