精华内容
下载资源
问答
  • 线程池面试题

    2021-07-15 00:08:32
    线程池面试题什么是线程池为什么要使用线程池实际项目中哪些地方会使用线程池线程池的作用创建线程池的Executors封装方法(不建议使用)线程池底层实现原理线程池中的线程是一直运行的吗四种拒绝策略为什么不建议...

    深入理解线程池底层原理

    什么是线程池

    统一管理和维护线程,减少创建和销毁线程的开销

    为什么要使用线程池

    在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。
    线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。

    在这里插入图片描述

    实际项目中哪些地方会使用线程池

    实际开发项目中,禁止new野线程,必须使用线程池来维护和创建线程
    JAVA线程池场景化总结

    线程池的作用

    1、降低资源损耗:池化技术复用线程,降低线程创建和销毁造成的损耗
    2、提高响应速度:省略了线程创建需要的时间
    3、提高线程可管理性:线程如果无限制创建,不仅会损耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统稳定性。线程池可以统一分配、调优和监控
    4、可拓展性

    创建线程池的Executors封装方法(不建议使用)

    线程池中只有一个线程

    ExecutorService pool = Executors.newSingleThreadExecutor();
    

    线程池中有固定数量线程

    ExecutorService pool = Executors.newFixedThreadPool(5);
    

    线程池中不限制线程数量(最大数量为Integer.MAX_VALUE)

    ExecutorService pool = Executors.newCachedThreadPool();
    

    线程池中定时执行任务(使用的是延迟工作队列)

    ExecutorService pool = Executors.newScheduledThreadPool(2);
    

    线程池底层实现原理

    在这里插入图片描述
    在这里插入图片描述

    线程池中的线程是一直运行的吗

    1、核心线程 且 allowCoreThreadTimeOut 为false,那核心线程在执行任务完后,会处于阻塞blocking状态,直到下一个任务取出它

    2、核心线程 且 allowCoreThreadTimeOut 为true,核心线程如果在keepAliveTime时间内没有新的任务,超时时间之前,处于阻塞状态blocking,超时时间到了后,线程状态将变为dead(terminated)

    3、非核心线程,超时时间之前阻塞状态blocking,超时时间之后,dead(terminated)

    4、如果线程池都关闭了,那所有的线程都会变为dead(terminated)

    四种拒绝策略

    • AbortPolicy(终止策略)

    终止策略 超出最大承载始终抛出异常

    new ThreadPoolExecutor.AbortPolicy()
    
    • CallerRunsPolicy(调用者执行策略)

    调用者执行策略 超出最大承载让调用者线程(main)执行任务,如果线程池已关闭则舍弃任务

    new ThreadPoolExecutor.CallerRunsPolicy()
    
    • DiscardPolicy(丢弃策略)

    丢弃策略 超出最大承载直接丢弃任务,不执行任何操作

    new ThreadPoolExecutor.DiscardPolicy()
    
    • DiscardOldestPolicy(丢弃最早任务策略)

    丢弃最早任务策略 超出最大承载丢弃队列中最早的任务并重试执行,如果线程池已关闭则舍弃任务

    new ThreadPoolExecutor.DiscardOldestPolicy()
    

    为什么不建议使用Executors创建线程池

    因为默认封装的Executors创建线程池使用的是无界队列(没有最大值的队列)来存放缓存任务,无限缓存任务容易发生内存溢出,也会导致最大线程数失效,一直使用核心线程
    在这里插入图片描述

    展开全文
  • Java线程池面试题

    万次阅读 多人点赞 2019-04-14 22:35:45
    1、什么是线程池 2、常见线程池

    1、什么是线程池

    java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池

    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

    如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。

    一个线程池包括以下四个基本组成部分:
    1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
    2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
    3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
    4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

    线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
    线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:
    假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

    2.常见线程池

    newSingleThreadExecutor
    单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
    newFixedThreadExecutor(n)
    固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
    newCacheThreadExecutor(推荐使用)
    可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
    newScheduleThreadExecutor
    大小无限制的线程池,支持定时和周期性的执行线程

    java提供的线程池更加强大,相信理解线程池的工作原理,看类库中的线程池就不会感到陌生了。
    在这里插入图片描述

    在这里插入图片描述

    要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

    2.1 newSingleThreadExecutor

    创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

    2.2 newFixedThreadPool

    创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

    2.3 newCachedThreadPool

    创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

    那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

    2.4 newScheduledThreadPool

    创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

    3 为什么不建议使用 Executors静态工厂构建线程池

    阿里巴巴Java开发手册,明确指出不允许使用Executors静态工厂构建线程池
    原因如下:
    线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

    说明:Executors返回的线程池对象的弊端如下:

    1:FixedThreadPool 和 SingleThreadPool:
    允许的请求队列(底层实现是LinkedBlockingQueue)长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM
    2:CachedThreadPool 和 ScheduledThreadPool
    允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
    在这里插入图片描述
    创建线程池的正确姿势

    避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了。

    private static ExecutorService executor = new ThreadPoolExecutor(10, 10,
            60L, TimeUnit.SECONDS,
            new ArrayBlockingQueue(10));
    

    或者是使用开源类库:开源类库,如apache和guava等。

    3、线程池常用参数

    /**
         * Creates a new {@code ThreadPoolExecutor} with the given initial
         * parameters.
         *
         * @param corePoolSize the number of threads to keep in the pool, even
         *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
         * @param maximumPoolSize the maximum number of threads to allow in the
         *        pool
         * @param keepAliveTime when the number of threads is greater than
         *        the core, this is the maximum time that excess idle threads
         *        will wait for new tasks before terminating.
         * @param unit the time unit for the {@code keepAliveTime} argument
         * @param workQueue the queue to use for holding tasks before they are
         *        executed.  This queue will hold only the {@code Runnable}
         *        tasks submitted by the {@code execute} method.
         * @param threadFactory the factory to use when the executor
         *        creates a new thread
         * @param handler the handler to use when execution is blocked
         *        because the thread bounds and queue capacities are reached
         * @throws IllegalArgumentException if one of the following holds:<br>
         *         {@code corePoolSize < 0}<br>
         *         {@code keepAliveTime < 0}<br>
         *         {@code maximumPoolSize <= 0}<br>
         *         {@code maximumPoolSize < corePoolSize}
         * @throws NullPointerException if {@code workQueue}
         *         or {@code threadFactory} or {@code handler} is null
         */
    
    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) { }
    

    corePoolSize:核心线程数量,会一直存在,除非allowCoreThreadTimeOut设置为true
    maximumPoolSize:线程池允许的最大线程池数量
    keepAliveTime:线程数量超过corePoolSize,空闲线程的最大超时时间
    unit:超时时间的单位
    workQueue:工作队列,保存未执行的Runnable 任务
    threadFactory:创建线程的工厂类
    handler:当线程已满,工作队列也满了的时候,会被调用。被用来实现各种拒绝策略。

    展开全文
  • 对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。 一、线程池是什么? 答:线程池,是一种...

    对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。

    一、线程池是什么?

    答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。

    二、线程池有几种?

    答:常见的线程池有四种。

    1. newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    2. newFixedThreadPool 创建一个定长线程池,可控制最大并发数,超出的线程将在队列中等待。
    3. newScheduledThreadPool 创建一个定时线程池,支持定时及周期性的执行任务。
    4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有的任务按照指定顺序执行(FIFO,LIFO)。

    三、线程池都有什么用?

    线程池的作用就是限制系统中执行线程的数量。

    线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。

    如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。总之就是低消耗,响应速度快,可管理性高。

    四、线程池中的几种重要的参数

    1. corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收。
    2. maximumPoolSize就是线程池中可以容纳的最大线程的数量。
    3. keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,util,就是计算这个时间的一个单位。
    4. workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。
    5. threadFactory,就是创建线程的线程工厂。
    6. handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。

    五、说说线程池的拒绝策略

    当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。

    1. AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
    2. CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
    3. DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
    4. DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

    除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

    六、初始化线程池时线程数的选择

    如果任务是IO密集型,一般线程数需要设置2倍CPU数以上,以此来尽量利用CPU资源。

    如果任务是CPU密集型,一般线程数量只需要设置CPU数加1即可,更多的线程数也只能增加上下文切换,不能增加CPU利用率。

    上述只是一个基本思想,如果真的需要精确的控制,还是需要上线以后观察线程池中线程数量跟队列的情况来定。

    七、线程池都有哪几种工作队列

    1. ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
    2. LinkedBlockingQueue一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
    3. SynchronousQueue一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
    4. PriorityBlockingQueue一个具有优先级的无限阻塞队列。
    展开全文
  • java线程池 面试题(精简)

    万次阅读 多人点赞 2018-12-24 20:36:09
    什么是线程池线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁...

    什么是线程池?

    线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。

    如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

     

    为什么要使用线程池?

    创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)

     

    线程池有什么作用?

    线程池作用就是限制系统中执行线程的数量。

    1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。

    2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。

     

    说说几种常见的线程池及使用场景

    1、newSingleThreadExecutor

    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    2、newFixedThreadPool

    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    3、newCachedThreadPool

    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    4、newScheduledThreadPool

    创建一个定长线程池,支持定时及周期性任务执行。

     

    线程池中的几种重要的参数

    corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收

    maximumPoolSize就是线程池中可以容纳的最大线程的数量

    keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清                                除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,

    util,就是计算这个时间的一个单位。

    workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。

    threadFactory,就是创建线程的线程工厂。

    handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。

     

    说说线程池的拒绝策略

        当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。

    • AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。

    • CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。

    • DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。

    • DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

        除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

     

    execute和submit的区别?

        在前面的讲解中,我们执行任务是用的execute方法,除了execute方法,还有一个submit方法也可以执行我们提交的任务。

    这两个方法有什么区别呢?分别适用于在什么场景下呢?我们来做一个简单的分析。

    execute适用于不需要关注返回值的场景,只需要将线程丢到线程池中去执行就可以了。

    submit方法适用于需要关注返回值的场景

     

    五种线程池的使用场景

    • newSingleThreadExecutor:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。

    • newFixedThreadPool:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制。

    • newCachedThreadPool:一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。

    • newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。

    • newWorkStealingPool:一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行。

     

    线程池的关闭

    关闭线程池可以调用shutdownNow和shutdown两个方法来实现

    shutdownNow:对正在执行的任务全部发出interrupt(),停止执行,对还未开始执行的任务全部取消,并且返回还没开始的任务列表。

    shutdown:当我们调用shutdown后,线程池将不再接受新的任务,但也不会去强制终止已经提交或者正在执行中的任务。

     

    初始化线程池时线程数的选择

    如果任务是IO密集型,一般线程数需要设置2倍CPU数以上,以此来尽量利用CPU资源。

    如果任务是CPU密集型,一般线程数量只需要设置CPU数加1即可,更多的线程数也只能增加上下文切换,不能增加CPU利用率。

    上述只是一个基本思想,如果真的需要精确的控制,还是需要上线以后观察线程池中线程数量跟队列的情况来定。

     

    线程池都有哪几种工作队列

    1、ArrayBlockingQueue

    是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。

    2、LinkedBlockingQueue

    一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列

    3、SynchronousQueue

    一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。

    4、PriorityBlockingQueue

    一个具有优先级的无限阻塞队列。

    展开全文
  • 线程、多线程与线程池面试题

    千次阅读 2018-07-11 23:47:47
    ● 概念 线程:进程中负责程序...线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对...
  • 一、线程池的好处? 1.通过new Thread来创建线程池会比较耗时,性能差,当我们在通过线程的时候,有可能会出现(创建线程+销毁线程)的时长>线程执行(业务逻辑)的时长; 2.线程缺乏统一管理,可能会出现无限制...
  • 10道线程池面试题

    2021-07-30 14:24:19
    面试题1:ThreadPoolExecutor 有哪些常用的方法? ThreadPoolExecutor有如下常用方法: submit()/execute():执行线程池 shutdown()/shutdownNow():终止线程池 isShutdown():判断线程是否终止 getActiveCount():...
  • 多线程都有哪些实现GCD要注意些什么三种线程优缺点 1NSThread轻量级的方式具有很少的规则和惯例依赖的东西少比较底层和原始 需要自己手动管理线程的生命周期同步的时候需要加锁来控制线程执行顺序会增加系统开销不...
  • 深度解读 Java线程池设计思想及源码实现 java 线程池有哪些关键属性? corePoolSize,maximumPoolSize,workQueue,keepAliveTime,rejectedExecutionHandler corePoolSize 到maximumPoolSize之间的线程会被回收,...
  • 六、使用线程池注意事项 避免使用无界队列 不要使用 Executors.newXXXThreadPool() 快捷方法创建线程池,因为这种方式会使用无界的任务队列,为避免 OOM,我们应该使用 ThreadPoolExecutor 的构造方法手动指定队列...
  • 一、什么是线程池线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁...
  • java之线程池面试题

    2018-11-15 00:08:00
    面试官:线程池有哪些?分别的作用是什么? 常用的线程池有: newSingleThreadExecutor newFixedThreadExecutor newCacheThreadExecutor newScheduleThreadExecutor 1、newSingleThreadExecutor:  单个...
  • JAVA备忘录(四):线程池面试题

    千次阅读 2020-01-20 17:52:12
    首先说一下它的定义,线程池是一种多线程处理形式,当有任务提交到线程池时,可以直接使用线程池内的线程来执行任务。而如果不使用线程池的话,每次任务的执行都需要进行一次线程的创建于下销毁,这个过程的开销是...
  • https://blog.csdn.net/qq_29373285/article/details/85238728 转载于:https://www.cnblogs.com/linliquan/p/11519187.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,518
精华内容 18,607
关键字:

线程池面试题