线程池常见面试题

本文详细介绍了Java线程池的创建方式、参数、run方法与start方法的区别,探讨了线程状态、同步机制(synchronized、乐观锁、公平锁)、死锁原理及避免方法,以及Spring框架中的线程池应用和线程通信。
摘要由CSDN通过智能技术生成

1、线程池有三种创建方式 分别是:

  (1) 继承thread 类   他的缺点是因为是继承 所以只能单继承

  (2)实现runnble 接口 实现runnble 接口的话没有继承限制  重写run方法即可

  (3) 实现callable 接口  callable 的话 需要返回值的话使用即可 重新的话 有的特殊我们需要  创建一个FutureTask 把实现callable的类放入进去 之后把这个FutureTast的类放入 Thread里。

run方法和start 方法的区别

run方法定义执行的代码

start 开启线程执行

2.线程池的7大参数:

        (1)核心线程数 :线程池中定义的主要核心的线程数量,及时他们这些线程处于空闲状态也不会对其进行销毁。

        (2)最大线程数:线程池中允许的最大的线程数量,当任务增加到超过核心线程数和同时等待队列也已经满了,就会创造临时线程数来进行处理任务,但是临时线程加上核心线程数不可以超过最大线程数。

        (3)线程等待时间:线程在空闲状态下的最大存活时间,当线程池中的线程数量超过最大核心线程数并空闲时间超过设定的等待时间就会销毁超过的线程这样用来节省资源的消耗。

          (4)时间单位: 线程等待时间的时间单位

        (5)工作队列:当线程池中线程多处于忙碌状态时,新的任务会被放入工作队列等待执行。

        (6)线程工程:用于创建线程池的工厂类,通过指定线程名称和优先等级,可以自定义创建线程的方式。

        (7)拒绝策略:当线程池达到最大线程数和等待队列也满了的时候,新的任务无法被提交到线程池的处理策略,常见的策略有丢弃任务并抛出异常,丢弃任务不抛出异常,将任务分配给线程来执行。

3.四个拒绝策略

丢弃任务抛出异常

丢弃任务不抛出异常

丢弃最前面的任务

4.线程池是如何操作的

       当线程任务发布时先判断核心线程数是否满了 没有满的话直接创建一个工作线程来进行处理, 如果满了的话就把这个任务放入线程队列等待有空余的工作线程来处理如果核心线程满了已经等待队列也满了时就创建临时线程进行处理,如果最大线程数也满了 等待队列也满了的时候就启动抛弃策略。

5.线程的六种状态

 新建,就绪,运行,阻塞,等待,死亡

当任务被创建时处于新建状态,调用start方法进入就绪状态,等待cpu分配资源进行处理这个任务

到达运行状态  当cpu去调用其他任务或者这个任务自己进入sleep 或者调用join方法当sleep结束后又会继续执行 等待cpu分配资源 当其他任务通过join进入这个线程时当然任务会继续进入就绪状态

运行的任务通过yueld()方法可以继续进入就绪状态 ,当线程任务调用wait方法时会释放锁进入线程等待状态 ,等待其他线程调用notify 或者notifyAll()来唤醒

死亡的话就是正常结束或者异常退出

6.线程安全问题

        (1)synchronized 和lock的区别

        synchronized 是关键字 在jvm层面 可以加载方法和静态代码块上

        synchronized 出现异常时会自动释放锁

         可重入锁在执行对象中所有同步方法不用再次获得锁

        synchronized 不可以手动释放锁,需要等待同步代码块或者同步方法执行完毕后自动结束

        lock API层面是接口

        lock 出现异常不会释放锁可能会造成死锁需要再finally中手动释放锁

        lock 锁可以根据lock()、tryLock()来获取锁的状态

        可重入锁在执行对象中所有同步方法不用再次获得锁

        可以调用api来手动释放锁

7.悲观锁和乐观锁

1、悲观锁是当线程拿到资源时,就对资源上锁,并在提交后,才释放锁资源,其他线程才能使用资源。
2、乐观锁是当线程拿到资源时,上乐观锁,在提交之前,其他的锁也可以操作这个资源,当有冲突的时候,并发机制会保留前一个提交,打回后一个提交,让后一个线程重新获取资源后,再操作,然后提交。和git上传代码一样,两个线程都不是直接获取资源本身,而是先获取资源的两个copy版本,然后在这两个copy版本上修改。
3、悲观锁和乐观锁在并发量低的时候,性能差不多,但是在并发量高的时候,乐观锁的性能远远优于悲观锁。
4、常用的synchronized是悲观锁,lock是乐观锁。

8.公平锁和非公平锁

 lock可以使用公平锁也可以使用非公平锁 公平锁 排队获取锁

 synchronized是非公平锁 就是锁的话是根据抢的

9.线程安全的特征

原子性:一个线程操作是不会被其他线程打断的

有序性:线程执行是有序的

可见性:一个线程修改其他线程是可见的

10.死锁

死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 程(线程)称为死锁进程(线程)。

11.形成死锁的四个条件

1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能 被一个线程(进程)占用,直到被该线程(进程)释放

2. 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已 获得的资源保持不放。 3. 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强 行剥夺,只有自己使用完毕后才释放资源。

4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路 (类似于死循环),造成永久阻塞

12.如何避免线程死锁

我们只要破坏产生死锁的四个条件中的其中一个就可以了。

13.Spring集成线程池

@Async标记在方法上, 表示当前方法是异步执行的

@EnableAsync 开启多线程异步

14.线程通信

        生产者和消费者就属于线程通信

        1.线程同步通信wait 等待线程  notifyAll 可以唤醒一个线程

        2.异步通信通过消息中间件来进行通信

        3.进程间的同学 feign mq等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值