多线程、线程池面试题

1、创建线程的方式有哪些?各有什么优缺点

​1.继承Thread类

        优点

                代码简单,可以直接使用Thread类中的方法。

        缺点

                Java是单继承的,继承了Thread就不能继承其他类了,不利于程序的扩展,不能
                返回现成的执行结果。

2.实现Runnable接口

        优点

                Java可以继承其他类,提高程序的可扩展性。

        缺点

                需要创建Runnable的实现,编程相对复杂,不能返回线程的执行结果。

3.实现Callable接口

        优点

                可以接收线程的执行结果,扩展性强,实现接口的同时还可以继承其他类。

        缺点。

               代码复杂。

4.线程池

2、runnable 和 callable 有什么区别?

​实现Callable接口重写的是call方法,其有返回值,由FutureTask对象接收,通过get方法获得线程的执行结果,编码相对复杂。call方法可以抛出异常

实现Runnable接口重写的是run方法,没有返回值,无法拿到线程的执行结果,run方法无法抛出异常。

3、线程通信的三个方法是什么?各自作用是什么?

​1.wait

        等待,等重新唤醒后进入就绪状态   

2.notify

        唤醒一个等待的线程,重新进入就绪状态,唤醒哪个由JVM决定   

3.notifyAll

        唤醒所有等待的线程,重新进入就绪状态

4、线程池的工作流程是什么?

​创建线程池

        

判断核心线程是否已满→否→创建核心线程

        ↓是

判断任务队列是否已满→否→添加至任务队列

        ↓是

判断临时线程是否已满→否→创建临时线程

        ↓是

执行任务拒绝策略

5、 线程池的7个核心参数是什么?

​1.核心线程数

2.最大线程数

3.临时线程存活时间

4.临时线程存活时间单位

5.线程池的任务队列

6.线程工厂

7.任务拒绝策略

6、为什么不建议用Executors创建线程池?

        ​Executors的FixedThreadPool和SimgleThreadPool的请求队列长度为Integer.MAX_VALUE,可能会导致请求堆积太多而导致OOM;

        ​Executors的CachedThreadPool和ScheduledThreadPool允许的最大线程数量为Integer.MAX_VALUE,可能会导致线程数量太多而导致OOM;

7、说几个你知道的线程池队列?

​ArrayBlockingQueue        有界阻塞队列,可以指定缓存队列大小

LinkedBlockingQueue      无界阻塞队列,最大线程数无效

SynchronousQueue          不存储元素的阻塞队列

8、线程池的拒绝策略有哪些?

​拒绝并抛出异常

拒绝不抛出异常

移除任务队列等待最久的任务并加入当前任务

把任务交给调用者执行

9、如何确定核心线程数

​进行计算量较大如算法、递归等操作时,核心线程数为CPU核+1

进行较多磁盘任务时,如文件的读写操作等,核心线程数为CPU核*2

10、线程的生命周期

     新建

        ↓   

     就绪←notify/notifyAll ←到时间了 ← 获得锁

        ↓        ↑                        ↑                      ↑

     运行→wait        →        sleep       →无法获得锁

        ↓

     销毁

11、wait和sleep的区别

​wait是无限等待,直到被其他线程notify或notifyAll唤醒,唤醒后回到就绪队列,wait用在同步锁种。

sleep是计时等待,时间到了就重新回到就绪队列,等待获得CPU执行权。

12、synchronized和lock的区别

synchronized是自动锁

        在同步方法中,拥有隐式锁,成员方法默认是this,类方法默认是类名.class

        在同步代码块中,括号内设置锁,设为同一个对象,一般的默认成员方法是this,类方法是类名.class


lock是手动锁

        需要手动创建锁,在线程核心方法前上锁,在线程核心方法结束后开锁,必须用try-catch-finally,将开锁放置finally中,避免因程序执行中出现错误产死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值