Java核心知识点常考面试题(持续更新中)
- 线程与线程池
- Java锁机制
- 轻量级锁
- 重量级锁
线程与线程池
一、线程
1、线程的状态
2、线程的创建方式
(1)继承 Thread 类;
(2)实现 Runnable 接口,不带返回值;
(3)实现 Callable 接口,带返回值,阻塞式获取返回值;
public static void main(String[] args) {
System.out.println("===开始===");
//通过结合FutureTask类实现
FutureTask<String> futureTask = new FutureTask<>(() -> {
String result = "";
//结果处理过程......
result = "Hello world!";
return result;
});
Thread thread = new Thread(futureTask);
thread.start();
try {
//阻塞主线程并获取返回值
String result = futureTask.get();
System.out.println("result = " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("===结束===");
}
(4)通过线程池创建线。注意:Java原生线程池(阿里官方不推荐使用Executors),原因如下:
二、线程池
1、线程池的核心参数
(1)corePoolSize:核心线程数。
(2)maxinumPoolSize:最大线程数。
(3)keepAliveTime:空闲线程存活时间。
(4)unit:时间单位(秒、分钟等)。
(5)workQueue:任务队列,存放任务的容器。
(6)threadFactory:线程工厂,可以使用默认的,或自定义的,通常使用默认。
(7)handler:拒绝策略,顾名思义,拒绝线程访问,JKD自带共有四种策略,如下:
1、new ThreadPoolExecutor.AbortPolicy():丢弃任务,并抛出RejectedExecutionException异常
2、new ThreadPoolExecutor.DiscardPolicy():丢弃任务,但是不抛出异常
3、new ThreadPoolExecutor.DiscardOldestPolicy():丢弃队列最前面的任务,然后重新提交被拒绝的任务
4、new ThreadPoolExecutor.CallerRunsPolicy():该任务被线程池拒绝,由调用 execute方法的线程执行该任务。
2、如何设置线程池参数
public static void main(String[] args) {
//计算CPU核数
int cpuCores = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor threadPool = new ThreadExecutor(
corePoolSize, //核心线程数
maxinumPoolSize, //最大线程数,CPU密集型即高并发(一般为CPU核数),IO密集型(一般为:CPU核数*2)
keepAliveTime, //空闲线程的存活时间
unit, //超时时间单位
workQueue, //工作队列:new LinkedBlockingDeque<>(3),阻塞队列
threadFactory, //Executors.defaultThreadFactory(),默认创建线程的工厂,一般不动
handler //拒绝策略:ThreadPoolExecutor.AbortPolicy(),队列满了还有任务直接抛出异常
);
}
3、线程池的状态及说明
Java锁机制
轻量级锁
一、CAS(Compare And Swap):比较并交换。也被成为:乐观锁、自旋锁
。参考文章:https://blog.csdn.net/weixin_43715214/article/details/128255225
重量级锁
一、synchronized 关键字