多线程常见面试题总结

谈谈线程池的理解(旷世2面、挖财、有赞)

线程池相当于一个容器,里面存放若干个线程,对若干个线程进行管理维护,在创建线程池的时候需要对线程池进行参数配置,常用的参数有核心线程数、最大线程数、非核心线程存活时间、工作队列、拒绝策略等(单位,线程创建工厂),核心线程数指的是线程池里可维护的最小线程数量,最大线程数指线程池允许创建的最大线程数量、非核心线程存活时间指的是一个可被回收的线程空闲时间大于非核心线程存时间就会被回收,工作队列用来存储等待执行的任务,拒绝策略当线程池内线程耗尽,并且工作队列已经满,提交新的执行任务,将使用拒绝策略进行处理。
易经筋版: 
        管理线程的池子,相比于手工创建、运行线程,使用线程池,有如下优点:
  • 降低线程创建和销毁线程造成的系统开销;
  • 提高响应速度,任务到达时,相对于手工创建一个线程,直接从线程池中拿线程,速度肯定快得多;
  • 提高线程可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一分配、调优和监控;

线程池的核心参数(旷世1面)

线程池的核心参数有核心线程数、最大线程数、非核心线程存活时间、工作队列、拒绝策略、单位和线程创建工厂, 核心线程数就是线程池可维护的最小线程数,最大线程数指的是线程池允许创建的最大线程数,非核心线程存活时间指的是一个可被回收线程的空闲时间大于非核心线程村时间、且线程池中的数量超过核心线程数但没有超过最大线程数时会被回收,工作队列指的是用来存储等待执行的任务,拒绝策略指的是当线程池内线程耗尽,并且等待队列已满时,若在提交一个执行任务,线程池会使用拒绝策略进行处理,单位指的是线程空闲时间单位,线程创建工厂指的是用来设置创建线程的工厂(可以给线程创建名称)

线程池运行过程(挖财)

当创建一个线程池后,线程池进入running状态,提交一个任务后,线程池会分配一个空闲线程,用于执行线程任务,如果线程池中不存在空闲线程,则会判断当前线程池中数量是否小于核心线程数,若小于则会创建一个核心线程,若大于则会判断等待队列是否已满,若未满,将当前线程加入等待队列,若满,则会判断当前池中数量是否大于最大线程数,若小于,则会创建一个非核心线程,若大于,则会按照拒绝策略进行处理。

常见线程池有哪些以及使用场景?(阿丘科技、浙江大华)

newFixedThreadPool(固定数目线程的线程池)
线程池特点:核心线程数和核心最大线程数一样、非核心线程存活时间为0、阻塞队列为无界队列LinkedBlockingQueue
工作机制:
  • 提交任务
  • 如果线程数小于核心线程,创建核心线程执行任务
  • 如果线程数等于核心线程,把任务添加至LinkedBlockingQueue阻塞队列
  • 如果线程池执行完任务,去阻塞队列领取任务,继续执行
使用场景:
  • FixedThreadPool适用于处理CPU密集型的任务,确保CPU长期被工作线程使用的情况下,尽可能少的分配线程,即适用于执行长期的任务;
newCachedThreadPool(可缓存线程的线程池)
线程池特点:核心线程数为0 最大线程数为Integer.MAX_VALUE 阻塞队列是SynchronousQueue队列 非核心线程存活时间为60s 
工作机制:
  • 提交任务
  • 因为没有核心线程,把任务添加至SynchronousQueue阻塞队列
  • 判断是否由空闲线程,若没有则创建一个线程执行
  • 若有就去除队列中线程执行
  • 执行完毕后的线程还可以存活60s,如果再次期间,接到任务, 可以继续存活下去;否则,则销毁
使用场景:用于并发执行大量短期的小任务
newSingleThreadExecutor(单线程的线程池)
线程池特点:核心线程数为1,最大线程数为1,阻塞队列是LinkedBlockingQueue,非核心线程存活时间为0
工作机制:
  • 提交任务
  • 线程池是否有一条线程在,如果没有,新建线程执行任务
  • 如果有,将任务加到阻塞队列
  • 当前的唯一线程,从队列取任务,执行完一个,再继续取,一个线程夜以继日的干活
使用场景:适用于串行执行任务的场景,一个任务一个任务的执行。
newScheduledThreadPool(定期及周期执行的线程池)
线程池特点:最大线程数为Integer.MAX_VALUE,阻塞队列是DelayedWorkQueue,非核心线程存活时间为0
ScheduleAtFixedRate():按照某种速率周期执行
ScheduleWithFixedDelay():在某个延迟后执行
工作机制:
  • 提交任务
  • 线程池中的线程从DelayQueue中取任务
  • 线程从DelayQueue中获取time大于等于当前时间的task
  • 执行完后修改这个task的time为下次被执行的时间
  • 这个task放回DelayQueue队列中
使用场景:周期性执行任务的场景,需要限制线程数量的场景

为什么要使用线程池?(理想ONE)

线程复用:控制最大并发数;管理线程
  • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

什么是线程?

    某些进程内部还需要同时执行多个子任务。例如,我们在使用WPS时,WPS可以一边打字,一边进行拼写检查,同时还可以在后台进行自动保存和上传云文档,我们把子任务称为线程。线程是进程划分的更小的执行单位。
       进程和线程的关系就是:一个进程可以包含多个线程,但至少会有一个主线程。

什么是进程?

    进程是程序的一次执行过程,是系统运行程序的基本单位。在Windows系统中,每一个正在执行的exe文件或后台服务,都是一个进程,由操作系统统一管理并分配资源,因此进程是动态的。

进程与线程的区别?

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位;
    资源开销:每个进程都有独立的代码副本和数据空间,进程之间的切换,资源开销较大;线程可以看做轻量级的进程,每个线程都有自己的独立的运行栈和程序计数器,线程之间切换,资源开销小;
    包含关系:一个进程包含多个线程,在执行过程中,线程的执行不是线性串行的,而是多条线程并行共同完成;
    内存分配:同一进程内的所有线程共享本进程的内存空间和资源;进程之间的内存和资源相互独立;
    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响;一个线程崩溃,会导致整个进程退出。所以多进程要比多线程健壮;
    执行过程:每个独立的进程有程序运行的入口和程序出口。但是线程不能独立执行,必须依存在应用程序(进程中),由应用程序提供多个线程执行控制;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值