线程池知识点及面试总结

Java线程池面试题 1、什么是线程池 2、常见线程池 阅读详情

1.为什么需要线程池?

在实际使用中,线程是很占用系统资源的,对线程管理不善,容易导致系统问题。因此,在很多并发框架中,都会使用线程池来管理线程,其好处如下:
(1)使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成额外的消耗,从而可以提高系统响应速度。
(2)通过线程池,可以对线程进行合理的管理,根据系统的承受能力调整可以运行的线程数量。

2.线程池的分类:

在这里插入图片描述

ThreadPoolExecutor
(1)newCachedThreadPool :
创建一个可根据业务需要,来创建新线程的线程池,可以重用之前构造的线程,并在需要时使用提供的ThreadFactory创建新线程。
特点:
A.线程池中线程的数量没有固定,可以达到最大值(Integer.MAX_VALUE)
B.线程池中的线程可用缓存重复利用和回收(回收默认时间是1分钟)
C.当线程池中,没有可用线程,会重新创建一个新线程来执行任务。

代码:
实现一个TaskThread,任务线程类


public class TaskThread implements Runnable {

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " is running");
    }
}

在测试类中:

ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0;i < 30;i++){
    executorService.execute(new TaskThread());
}
executorService.shutdown();

(2)newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行池中线程。
大多数线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交任务,则在有可用线程之前,提交任务将会在队列中等待。
如果在线程池运行过程中,由于某些原因而导致任何线程终止,那么就会创建一个新线程代替终止线程执行后续任务。
特点:
A.线程池中的线程处于一定的数量,可以很好地控制线程的并发量。
B.线程可以重复使用,在显示关闭之前,线程将会一直存在。
C.超出一定量的线程被提交时,需要在队列中等待。

// newFixedThreadPool: 线程池需要指定最多能有容纳多少个线程
ExecutorService executorService = Executors.newFixedThreadPool(4);
for (int i = 20;i > 0;i--){
    executorService.execute(new TaskThread());
}
executorService.shutdown();

(3)newSingleThreadExecutor :
创建一个使用单个工作线程的Executor,以无界队列的方式来运行该线程。
如果在线程池运行期间由于某些原因终止了此单个线程,然而还有后续任务需要执行,就会创建一个新线程来执行后面的任务。
可保证无需重新配置,此方法所返回的执行程序就可以使用其他的线程。
特点:线程池中最多执行1个线程,其后提交的任务将会排在阻塞队列中等待执行。

ExecutorService executorService = Executors.newSingleThreadExecutor();
//         while (!executorService.isTerminated()){
         for (int j = 0;j < 50;j++){
             executorService.execute(new TaskThread());
         }
         executorService.shutdown();

ScheduledThreadPoolExecutor :可定时或延迟执行线程活动
(1)newScheduledThreadPool :
创建一个线程池,它可安排在给定延迟后运行命令或定期地执行。
特点:线程池中具有指定数量的线程,空线程也会被保留
(2)newSingleThreadScheduledExecutor
创建一个只有单线程的线程池,它可安排在给定延迟后执行命令或者定期地执行。
特点:线程池最多执行1个线程,之后提交的线程任务将会排在阻塞队列中等待执行。
代码:
在测试类中,为能看到延迟执行和定期执行的效果,可以多启动几个线程,创建多个匿名内部类来实现Runnable接口

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    System.out.println(System.currentTimeMillis());
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("1------延迟一秒执行,每三秒执行一次");
            System.out.println(System.currentTimeMillis());
        }
    },1,2, TimeUnit.SECONDS);
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("2------延迟一秒执行,每两秒执行一次");
            System.out.println(System.currentTimeMillis());
        }
    },1,2, TimeUnit.SECONDS);
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("3-------延迟一秒执行,每两秒执行一次");
            System.out.println(System.currentTimeMillis());
        }
    },1,2, TimeUnit.SECONDS);
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("4--------延迟一秒执行,每两秒执行一次");
            System.out.println(System.currentTimeMillis());
        }
    },1,2, TimeUnit.SECONDS);
      // shutdown方法关闭线程池,可以避免资源的浪费
     scheduledExecutorService.shutdown();
}

ForkJoinPool:
newWorkStealingPool:
创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,如果不传入并行级别参数,就会默认并行级别为当前系统的CPU个数。

3.线程池的创建:

// ThreadPoolExecutor类的构造方法如下:
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) { ..... }

构造器的参数说明:
corePoolSize :核心线程池 能够创建线程的数量
maximumPoolSize:线程池能创建线程的最大个数
keepAliveTime:(空闲线程的存活时间),线程池的工作线程空闲后,保持存活的时间。所以,如果 任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。
unit:为keepAliveTime指定时间单位,可选的单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、毫秒(MILLISECONDS)、微秒(MICROSECONDS,千分之一毫秒)和纳秒 (NANOSECONDS,千分之一微秒)。
workQueue:用于保存任务的阻塞队列(任务队列),相当于生产者-消费者模式中的传输通道。
threadFactory:创建线程的工厂类
handler:饱和策略/拒绝策略,队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常(RejectedExecutionException)。

注:当提交一个任务到线程池时,如果当前 poolSize < corePoolSize 时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程,这样可以减少任务被线程池处理时所需的等待时间。

4.execute( )的执行逻辑:

在这里插入图片描述
(1)如果当前运行的线程数量少于corePoolSize,就会创建新的线程来执行新的任务。
(2)如果当前运行的线程数量等于或大于corePoolSize,就会将提交的任务加入到阻塞队列workQueue中。
(3)如果当前阻塞队列已满的话,就会创建新的线程来执行任务。
(4)如果线程数量超过了maximumPoolSize,就会交由饱和策略RejectedExecutionHandler来处理。

饱和策略/拒绝策略:
(1)ThreadPoolExecutor.AbortPolicy :丢弃任务并抛出RejectedExecutionException异常,是默认的饱和策略。
(2)ThreadPoolExecutor.DiscardPolicy:丢弃任务但不会抛出异常。
(3)ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务,在重复此过程
(4)ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

5.线程池的工作原理(执行需要提交的任务过程):

线程池的执行过程:
在这里插入图片描述

(1)先判断线程池中核心线程池所有的线程是否都在执行任务,如果不是所有线程都在执行,则创建一个线程执行刚提交的任务,否则,进行第(2)步
(2)判断当前阻塞队列是否已满,如果未满,则将提交的任务放置在阻塞队列中,如果阻塞队列没满,则进入第(3)步
(3)判断线程池中所有的线程是否都在执行任务,如果没有,则创建一个新的线程来执行任务,否则,就交由饱和策略进行处理。

6.线程池的生命周期

(1)各个状态的说明:
在这里插入图片描述

RUNNING:能接受新提交的任务,还能处理阻塞队列中的任务。
SHUTDOWN:关闭状态,不再接受新提交的任务,但可以继续处理阻塞队列中已经保存的任务。
STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务线程。
TIDYING:如果所有的任务都已经终止了,workerCount(有效线程数)为0,线程池进入TIDYING状态后,会调用terminate( )方法进入TERMINATED状态。
(从SHUTDOWN状态到TIDYING阻塞队列为空,线程池中工作的线程数量为0 )
TERMINATED: 默认terminated( )方法中什么也不会做

(2)线程池的关闭
关闭线程池,可以通过shutdown和shutdownNow两个方法来实现
步骤:遍历线程池中的所有线程,然后依次中断线程
a.shutdownNow :将线程池的状态设置为STOP,然后,中断所有正在执行和未执行任务的线程,返回等待执行任务的列表。(太过暴力,不推荐)
b.shutdown:只是将线程池中的线程设置SHUTDOWN状态,让正在执行的线程继续执行直至完毕,中断所有还未执行任务的线程。

7.线程池中常用的几种阻塞队列(任务队列):

ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO排序元素,吞吐量通常要高于 ArrayBlockingQueue。静态工厂方法固定线程池和单例线程池使用了这个队列。
DelayQueue:使用该队列向线程池提交的任务不会被真正地保存,而总是将新任务提交给线程执行,如果没有空闲的线程,则尝试创建新的线程。
PriorityBlockingQueue:一个具有优先级的阻塞队列。该队列可以控制任务的执行先后顺序,其他队列都是按照先进先出算法处理任务的,而PriorityBlockingQueue则根据任务自身的优先级顺序先后执行。
SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法

面试题补充 : 如果提交任务时,线程池队列已满会发生什么?

如果使用的是无界队列LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为LinkedBlockingQueue可以近乎认为是一个无穷大的队列,可以无限存放任务.

如果使用的是有界队列比如ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,会根据maximumPoolSize的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy.

8. 实现Callable接口和Runnable接口的区别:

在这里插入图片描述
注:submit方法是基方法Executor.execute(Runnable …)的延伸,通过创建并返回一个Future类对象,可用于取消执行或等待完成。

代码:

import java.util.concurrent.Callable;
public class Task implements Callable<String> {
    private int i;
    public Task(int i){
        this.i = i;
    }
    @Override
    public String call() throws Exception { 
           //允许将异常向上抛出或在内部用try-catch进行处理
        Thread.sleep(500);
        return Thread.currentThread().getName() + " is running" + i;
    }
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 20; i++) {
            Future<String> submit = executorService.submit(new Task(9));  
            try {
                String s = submit.get();
                System.out.println(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        executorService.shutdown();
    }
}

面试补充:
执行execute()方法和submit()方法的区别:
execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否。execute方法中的参数为线程对象,该对象实现Runnable接口

submit()方法用于提交需要返回值的任务。线程池会返回一个Future类型的对象,通过这个Future对象可以判断任务是否执行成功,并且可以通过Future的get()方法来获取返回值.
submit方法中的参数为线程对象,该线程对象实Callable接口
注意:Future的get()方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

客户端代码应该尽可能早地向线程池提交任务,并仅在需要相应任务的处理结果数据的那一刻才调用Future.get().

HashMap与线程池:Java面试核心知识点解析 哈希表作为基础数据结构,通过键值对存储实现高效查找。Java中的HashMap采用数组+链表+红黑树的混合结构,在JDK8引入红黑树优化极端情况下的查询效率。理解其扩容机制、树化阈值等核心参数,对处理高并发场景至关重要。线程池则是多线程编程的核心组件,通过核心参数配置实现资源复用和任务调度。掌握ThreadPoolExecutor的工作流程和四种拒绝策略,能够有效应对不同业务场景的需求。这些技术不仅是面试高频考点,更是构建高并发系统的基石,在电商秒杀、实时计算等场景中广泛应用。 阅读详情

相关推荐

(面经总结)一篇文章带你整理面试过程中关于多线程中的线程池的相关知识点

文章目录一、线程池的工作原理二、线程复用三、线程池的核心组件和核心类四、Java线程池的工作流程五、线程池的拒绝策略六、5中常用的线程池1. newCachedThreadPool2. newFixedThreadPool3. newScheduledThreadPool4. newSingleThreadExecutor5. newWorkStealingPool六、面试题 一、线程池的工作原理 线程是非常宝贵的计算资源,在每次需要时创建并在运行结束后销毁是非常浪费资源的。 Java线程池主要用于管理线程

南淮北安的博客 452

面试题——线程池

1.为什么要用线程池 创建线程和回收线程都会占用系统资源,如果任务来了才创建线程那么响应时间会变长。提前创建一些线程并交给线程池管理,可以降低资源消耗、提高响应速度、提高线程的可管理性。 2. 线程池执行流程(原理) 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务,这一步骤需要获取全局锁。 如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQu...

dl674756321的博客 6378

ADS仿真设计平行定向耦合器学习笔记

ADS仿真设计平行定向耦合器

qq_36521926的博客 1万+

常见面试题之线程池总结

聊一下并行和并发有什么区别?说一下线程和进程的区别? 如果在java中创建线程有哪些方式?刚才你说的线程中的wait和sleep方法有什么不同呢?讲一下synchronized关键字的底层原理?那关于synchronized的锁升级的情况了解吗?synchronized和Lock有什么区别 ?线程池的种类有哪些?线程池的核心参数有哪些?那你知道ThreadLocal的底层原理实现吗?那关于ThreadLocal会导致内存溢出这个事情,了解吗?

时代各有不同,青春一脉相承。 872

获取本机正版windows10激活密钥,以及正版office

本方法面向的是以前买过笔记本电脑给你预装了正版系统,激活了正版office(一般是家庭版)的情况,其他情况请自行尝试。

qq_45774917的博客 2万+

EXCEL VBA 导出高清图片方法

EXCEL VBA 导出高清图片方法 将EXCEL表格内容另存为图片的方法有很多种,简单的比如“复制为图片格式并另存”,“打印成XPS”等等,本文着重的是利用VBA实现的方法。 该方法适合用于中大型图文表格输出为图片格式,方便传阅,在office2010及以上版本最为流畅。 具体看代码: Sub printA4() Dim rng As Range '定义截图范围变量 'm = 20...

nfser_burn7的专栏 1万+

Java高级工程师必备:线程池面试题完全指南(2025版)

深度解析Java线程池核心原理,涵盖ThreadPoolExecutor参数调优、拒绝策略、监控实践等高频面试题,助力Java高级工程师面试通关

weixin_54726354的博客 1472

抖音直播“卡黑屏”技术解析:从实现原理到平台风控与合规运营

在直播技术领域,视频流推送与实时互动是核心基础。其原理在于通过编码软件(如OBS)将音视频数据封装后,经由网络协议推送到服务器,再分发给观众。这项技术的价值在于支撑了实时、高并发的在线互动场景,是直播、在线会议等应用的基石。然而,在追求流量和互动的实践中,衍生出一些非常规操作,例如通过技术手段中断或控制视频流推送,仅保留音频和互动功能,以达到特定运营目的。这便涉及到了**卡黑屏**这一具体现象。它本质上是对直播流的人为干预,常与**流量博弈**和**风险规避**等动机相关联。从工程实践角度看,实现方式多样,

weixin_29895109的博客 1310

线程池常见面试题(20道)

线程池是一组维护线程的池子,可以在需要时重复使用线程,而不是为每个任务创建新线程。它的目的是提高多线程应用程序的性能、可管理性和可扩展性。使用线程池可以减少线程的创建和销毁开销,避免资源浪费。线程池的预热机制是指在应用程序启动时预先创建一定数量的核心线程,以减少任务提交后的线程创建延迟。这可以通过设置核心线程数为一个较小的值,并使用任务队列来实现。随着应用程序的运行,线程池可以根据实际需求动态增加线程数。任务队列是线程池中用于存储等待执行的任务的数据结构。临时存储等待执行的任务,避免任务丢失。

m0_54187478的博客 1万+

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

每日Java面试场景题知识点之-线程池

线程池是Java并发编程的重要组成部分,合理使用线程池能够显著提高系统的性能和稳定性。在实际开发中,需要根据具体的业务场景选择合适的线程池类型和参数配置,同时要注意异常处理和监控,确保线程池的健康运行。

2301_76981777的博客 402

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4482

Java面试知识点3——线程、多线程与线程池

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。创建线程池:一种是 通过 ThreadPoolExecutor 创建的线程池;另一种是通过 Executors 创建的线程池。1. Executors.newFixedThreadPool:创建⼀个固定⼤⼩的线程池,可控制并发的线程数,超出的线程会在队列中等待;

weixin_45610121的博客 230

【WRF理论第十四期】 VEGPARM.TBL 文件详解

WRF 读取 VEGPARM.TBL 文件

WW、forever的博客 576

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

2024年Android知识点之线程池,Android面试知识点梳理

这里我希望可以帮助到大家提升进阶。这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略。

2401_84520118的博客 1139

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java线程池:面试中你必须掌握的核心知识点!

《Java线程池:面试中你必须掌握的核心知识点!》:本文深入解析Java线程池的概念与核心实现,包括Executor框架、ThreadPoolExecutor参数设置、固定大小线程池和Cached线程池的优缺点。文章通过案例分析,帮助读者理解如何根据业务场景合理配置线程池,避免资源耗尽或任务积压问题。掌握这些知识点,助你在面试中脱颖而出!

yanpeng2580的博客 567

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JUC知识点总结(八)线程池面试知识点总结

15. 线程池 15.1 为什么要使用线程池? 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度:任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的可管理性 15.2 线程池的体系结构: java.util.concurrent.Executor : 负责线程的使用与调度的根接口 ExecutorService 子接口: 线程池的主要接...

时光匆匆独白 的博客 372

每日Java面试场景题知识点之线程池

线程池是Java并发编程中的重要组件,能够有效管理和复用线程资源,提升系统性能和稳定性。本文将详细讲解线程池的应用场景、常见类型及使用中的问题解决方案。

2301_76981777的博客 278

Java笔面试知识点整理:线程池

**为什么要使用线程池?**使用线程池主要有以下一些原因: 降低资源消耗。创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程。 控制并发的数量。并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因) 可以对线程做统一管理。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 如果为每一个请求都新开一个线程,会有什么问题? 线程生命周期的开销非

qq_41615726的博客 238

线程池的执行原理,参数等知识点(面试常用)

线程池中会维护一个最小的线程数量corePoolSize,如果线程池中的线程数量小于corePoolSize,即使有些线程处理空闲状态,它们也不会被销毁。一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁。如果线程池线程数量过大,大量线程可能会同时抢占 CPU 资源,这样会导致大量的上下文切换,从而增加线程的执行时间,影响了执行效率。如果线程池线程数量太小,当有大量请求需要处理,系统响应比较慢,会出现任务队列大量堆积任务导致OOM。

kiku1002149488的博客 721

堵塞队列&线程池大厂面试涉及知识点

时代在进步,科技在发展,hr都越来越难对付了,你呢!还停留在原地吗? 下面我个人总结了一些,java高并发堵塞队列,线程池这一系列面试问题。想拿大厂offer就跟我一起探讨一下以下问题吧。考察一个程序员功底如何,基本问一些这类问题就能了解。然而,身边小伙伴很多还原地不动,对这些面试题缺乏总结,或者很懵懂。导致面试都不是很理想,甚至吃了不少哑巴亏。作为同行我总结以下知识点,一起探讨学习。 1、堵塞队列 1.1、堵塞队列介绍 堵塞队列,顾名思义,首先它是一个队列,而一个堵塞队列在数据结构中所起的作用大致

y_yJava的博客 388

Java最新Java~线程池与线程池的优化,一线互联网公司Java面试核心知识点

FixedThreadPool和SingleThreadPool中的LinkedBlockIngQueue的默认允许长度为Integer.MAX_VALUE, 可能会堆积大量的请求, 从而导致OOMLinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列,在未指明容量时,容量默认为Integer.MAX_VALUE。CachedThreadPool和ScheduledThreadPool允许创建的线程的最大值是Integer.MAX_VALUE 可能会创建大量的线程, 从而导致OOM。

2401_84689725的博客 1210

Java线程池相关知识点总结,2024年最新高频面试问题

Worker是一个Runnable,同时拥有一个thread,这个thread就是要开启的线程,在新建Worker对象时同时新建一个Thread对象,同时将Worker自己作为参数传入TThread,这样当Thread的start()方法调用时,运行的实际上是Worker的run()方法,接着到runWorker()中,有个while循环,一直从getTask()里得到Runnable对象,顺序执行。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

2401_84433853的博客 1035
上一篇: 学习笔记(1):图解数据结构与算法-栈和队列在现实中的应用
下一篇: 暴力递归改动态规划之最长回文子序列问题
咸鱼也有爱
博客等级 码龄7年 133粉丝 47原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值