首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java线程池的面试题_献给准备面试的你,Java线程and线程池面试题小结「建议收藏」

因为篇幅有限,所以这次的文章不会包含面试题的所有的内容,在这里求大家点一波关注啦!以后会持续更新哒! 1、为什么用线程池?...有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还长。...运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。...直到线程进入就绪状态,才有机会转到运行状态。 5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。 8、wait方法被调用时,所在线程是否会释放所持有的锁资源?...wait:释放CPU,释放锁; sleep:释放CPU,不释放锁。 最后,创作不易,请大家多多支持我,点点关注不迷路,转发评论工作顺利呀!

35710

JUC系列(九)| ThreadPool 线程池

当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池 的拒绝策略了。...newCachedThreadPool 作用:创建一个可缓存线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。...特点: 线程池中数量不固定,可以达到(Interger. MAX_VALUE) 线程池中的线程可进行缓存重复利用和回收(回收默认时间为 1 分钟,即1分钟内没有任务的线程)。...keepAliveTime为0,一旦有多余的空闲线程,就会被立即停止掉。 阻塞队列采用了LinkedBlockingQueue,它是一个无界队列,因此永远不可能拒绝任务,超出的任务都需在队列中等待。...//如果池已停止或有资格关闭,则此方法返回 false。 //如果线程工厂在询问时未能创建线程,它也会返回 false。

33230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Java 基础篇】ThreadPoolExecutor 详解

    线程池是一组维护着多个线程的池子,这些线程可以被反复使用,以执行异步任务。线程池的主要目的是为了管理线程的生命周期,降低线程创建和销毁的开销,提高应用程序的性能和稳定性。 2. 为什么需要线程池?...即使这些线程处于空闲状态,也不会被销毁,除非线程池被关闭。这个参数可以理解为线程池的基本容量。 maximumPoolSize:最大线程数,线程池中最多可以拥有的线程数量。...keepAliveTime:非核心线程闲置超时时间。当线程池中的线程数量超过 corePoolSize 时,多余的空闲线程会在等待一定时间后被销毁。这个参数指定了空闲线程的存活时间。...SHUTDOWN:线程池处于关闭状态,不再接受新任务,但会继续处理已有任务,直到任务队列为空。 STOP:线程池立即停止,正在执行的任务会被中断,尚未执行的任务会被移出队列。...当线程池处于 SHUTDOWN 状态时,不再接受新任务,但会继续执行已有任务,直到任务队列为空。 当线程池处于 STOP 状态时,会立即停止所有正在执行的任务,并清空任务队列。

    1K50

    JAVA线程池

    (4)unit:keepAliveTime参数的时间单位 (5)workQueue:任务队列,被提交但是尚未被执行的任务将存放在此。 (6)threadFactory:生成线程池中工作线程的工厂。...3.如果当前运行的线程数量大于corePoolSize,并且有部分线程在keepAliveTime时间内无事可做,就会执行线程销毁,直至线程数量等于corePoolSize为止。...可能上述解释有点抽象,下面就是一个比喻,一看就明: 银行网点大家都知道,通常营业的时候会有几个正在服务的窗口,也会有几个停止服务的窗口(就是没有漂亮小姐姐的那种,懂了吧!)...如果值班窗口都在办理业务并且侯客区已满,银行就会进行将停止服务的窗口开通(称为“加班窗口”)。如果全部窗口都在办理业务,侯客区已满,大堂经理就会进行拒绝客户的操作,这就是拒绝策略。...如果办业务人数持续减少,如果加班窗口已经不办业务了,过了一段时间(也即是keepAliveTime)之后就会将加班窗口撤掉,直到所有加班窗口都被撤掉。 那什么又是拒绝策略呢? ?

    32110

    这些问题都不知道,还敢说自己熟悉Java的线程池?

    核心线程如果设置的不会被回收且核心线程池已经被填满(未满的情况下任务提交是不会经过队列的),那么在空闲时会处于Waiting状态,等待任务到来时调用Support.unpark()方法转变为Runnable...take方法会阻塞当前线程,直到从队列中获取到一个任务或者线程被中断。...在这种情况下,线程会使用take方法来从工作队列中获取任务。take方法会阻塞当前线程,直到从队列中获取到一个任务或者线程被中断。]...这些状态的变化通常是单向的,即从运行中到关闭,再到停止,然后是阻塞和终止。一旦线程池进入终止状态,它就不能被重新启动或回到之前的状态。...异常处理:如果任务在执行的时候抛出异常,异常会被捕获并存储在返回的Future对象中。我们可以通过Future.get来获取异常。 4.线程池中的线程出现异常之后,这个线程会被销毁还是继续复用?

    15510

    计算机基础知识整理汇总(一)

    初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。 作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。 2....初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。...但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。 3....进程终止时,消息队列及其内容并不会被删除。 3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。...因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问 信号量Semphare:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目

    47920

    快速 Get 面试题中:线程池七个参数和工作原理问题,理解万岁

    为什么不建议使用Executors创建线程,而使用ThreadPoolExecutor实现类来创建线程? 线程池如何配置合理的线程数。 问题,都是一步一步深入。...原因: 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。...要保留在池中的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut maximumPoolSize– 池中能够容纳同时执行的最大线程数,此值必须大于等于1....当前线程池数量超过corePoolSize时,当空闲时间达到KeepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。...threadFactory– 执行程序创建新线程时使用的工厂 ,一般用默认即可。 handler– 执行被阻塞时使用的处理程序,因为达到了线程边界和队列容量。平常称为拒绝策略。

    62920

    【Chromium】Base库的Thread

    ThreadPriority priority = ThreadPriority::NORMAL;    // 如果为 false,则在线程销毁时不会进行 join。   ...// 不可加入的线程无法加入(必须泄漏),也无法销毁或停止(Stop())。   ...//  // 如果线程已经停止或正在停止,则可以多次调用 Stop,如果线程已经停止或正在停止,则会被忽略。 ...Start来启动线程可以重复调用Stop/Stopsoon正常运行的线程无法被跨线程调用其内部API,例如停止线程之类DetachFromSequence之后允许其他线程跨线程调用当前线程api每个线程都应该具有独一无二的线程...WaitUntilThreadStarted可以多次调用FlushForTesting可以多次调用,当线程未启动或者停止之后,不会执行任何操作也不会阻塞谢谢各位,如果有感兴趣的模块或者代码需要攻略,也可以留言

    48210

    android service详解(1)

    服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响,除非系统必须回收内存资源,否则系统不会停止或销毁Service。...(4)Service默认并不会运行在子线程中,Service是在主线程里执行操作的,因此,不要在Service中执行耗时的操作,避免因为执行耗时操作而导致ANR(ApplicationNot responding...),除非你在Service中创建了子线程来完成耗时操作。...多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。...也就是说,除非系统必须回收内存资源,否则系统不会停止或销毁服务,而且服务在onStartCommand() 返回后会继续运行。

    1.4K20

    Java的ThreadPoolExecutor

    核心池中的线程会一致保存在线程池中(即使线程空闲),除非调用allowCoreThreadTimeOut方法允许核心线程在空闲后一定时间内销毁,该时间由构造方法中的keepAliveTime和unit参数指定...; 在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法...,则会被销毁,直到线程池中的线程数不超过corePoolSize。...ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。...这里把keepAliveTime设置为60L,意味着CachedThreadPool中空闲线程等待新任务的最长时间为60秒,空闲线程超过60秒后将会被终止。

    63820

    线程池

    SingleThreadExecutor: 方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。...时,**如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。...再看这里的解析的时候,我同样搜集了很多网上的解释,稍微有点点晦涩,我按照我的理解从新写了一段 首先问题是如何保证核心线程不被销毁,那么先看看什么情况下会被销毁?...如果当前活动线程数小于等于核心线程数,同样也是去缓存队列中取任务,但当缓存队列中没任务了,就会进入阻塞状态,直到能取出任务为止,因此这个线程是处于阻塞状态的,并不会因为缓存队列中没有任务了而被销毁。...而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。 缓存队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。

    67420

    面渣逆袭:线程池夺命连环十八问

    什么是线程池? 线程池: 简单理解,它就是一个管理线程的池子。 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。...秒 workQueue:线程池等待队列,使用 LinkedBlockingQueue阻塞队列 同时还用了synchronized 来加锁,保证数据不会被重复推送: synchronized...shutdown() 将线程池状态置为shutdown,并不会立即停止: 停止接收外部submit的任务 内部正在跑的任务和队列里等待的任务,会执行完 等到第二步完成后,才真正停止 shutdownNow...极端情况下会创建过多的线程,耗尽 CPU 和内存资源。由于空闲 60 秒的线程会被终止,长时间保持空闲的 CachedThreadPool 不会占用任何资源。...执行完任务的线程,还可以存活60秒,如果在这期间,接到任务,可以继续活下去;否则,被销毁。 适用场景 用于并发执行大量短期的小任务。

    39720

    理解Java并发工具包线程池的设计

    shutdownNow() 直接发送打断信号,让线程优雅的停止,如果忽略了中断信号,那么这个方法和shutdown方法作用一样 线程池关闭后,不会有任务还在执行,也不会有任务在等待执行,并且也不会有新的任务可以被提交...=maximumPoolSize,//核心数量=最大线程池数量=固定数量 keepAliveTime=0//永远不销毁线程,等于0的情况,核心线程在不使用的时候不能被销毁 unit=TimeUnit.MILLISECONDS...corePoolSize=maximumPoolSize=1,//核心数量=最大线程池数量=1 keepAliveTime=0//永远不销毁线程,等于0的情况,核心线程在不使用的时候不能被销毁 unit...0//永远不销毁线程,等于0的情况,核心线程在不使用的时候不能被销毁 unit=TimeUnit.NANOSECONDS//单位纳秒 workQueue=new DelayedWorkQueue() /...永远不销毁线程,等于0的情况,核心线程在不使用的时候不能被销毁 unit=TimeUnit.NANOSECONDS//单位秒 workQueue=new DelayedWorkQueue() //类似DelayQueue

    72620

    线程

    当一个线程持续处于空闲状态的时间达到了keepAliveTime时,如果当前正在运行的线程数大于corePoolSize,则该线程会被立即销毁,直到线程池的大小缩减到maximumPoolSize。...状态切换:调用shutdown()接口 STOP 当前线程池拒绝接收新任务,不处理已添加的任务同时停止正在处理的所有任务。...线程池被创建后其中是否有线程?如果没有,如何进行预热? 线程池被创建后如果没有任务传递就不会有线程存在。...核心线程与非核心线程的销毁机制 对于核心线程而言,其默认不回被销毁,但可以通过调用allowCoreThreadTimedOut(boolean value)方法来指定核心线程可以按照非核心线程的方法被销毁...当Thread的run方法执行完一个任务后,会循环的从等待队列中取出任务来执行,这样线程就不会被立即销毁 当工作线程数小于核心线程数,空闲的核心线程尝试从等待队列中获取任务时,队列中Runnbale的任务数量为

    27930

    Android四大组件之Service

    ; 一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁; 在Service的onDestroy()方法里去清理掉那些不再使用的资源,防止在Service...Service 不会专门启动一个线程执行耗时操作,所有的操作都是在主线程中进行的,以至于容易出现ANR,所以需要手动开启一个子线程; Service 不会自动停止,需要调用 stopSelf()方法...或者 是 stopService() 方法停止; 使用 IntentService不会出现这两个问题,因为 IntentService在开启 Service时,会自动开启一个新的线程来执行它,另外,当...8.如何保证服务不会被杀死 第一种方式,返回 START_STICKY 或 START_REDELIVER_INTENT 当 Service因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此...Service,一旦创建成功后将回调 onStartCommand方法,但其中的 Intent将是 null,除非有挂起的 Intent,如 pendingintent,这个状态下比较适用于不执行命令

    84010

    讲真 这次绝对让你轻松学习线程池

    看到老王 就来气,也不给不办理也不让他走。 经理让老王 取尝试跟座位席中最前面的人聊一聊看是否可以加塞,可以就办理,不可以还是被踢走。 经理直接跟老王 说谁让你来的你找谁去我这办理不了。...,用来创建线程对象,一般不会动。...,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁 public void destroy() { // 工作线程停止工作,且置为null...shutdown() 将线程池状态置为shutdown,并不会立即停止: 停止接收外部submit的任务 内部正在跑的任务和队列里等待的任务,会执行完 等到第二步完成后,才真正停止 shutdownNow...一般情况下会和shutdown方法组合使用,调用后当前线程会阻塞,直到 等所有已提交的任务(包括正在跑的和队列中等待的)执行完 或者等超时时间到 或者线程被中断,抛出InterruptedException

    43730

    thread中join和detach的区别

    当thread::join()函数被调用后,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用来知道一个线程已结束的机制。...去销毁一个仍然可以“joinable”的C++线程对象会被认为是一种错误。为了销毁一个C++线程对象,要么join()函数需要被调用(并结束),要么detach()函数被调用。...如果一个C++线程对象当销毁时仍然可以被join,异常会被抛出。...当一个程序终止时(比如main返回),剩下的在后台的detached线程执行不会再等待;相反它们的执行会被挂起并且它们的本地线程对象会被销毁。...关键地,这意味着这些线程的栈不是完好无损的,因此一些析构函数不会被执行。依赖于这些行为,一些析构函数假象会被承担,这可能是一种坏情形,好像程序已经Crash或者已经被kill。

    69230

    Android中各组件的生命周期

    暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。...(3)stoped:完全被另一个Activity遮挡时处于停止状态,它仍然在内存中保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉。...到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。...onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate()方法中创建的资源,如结束线程等。...这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。

    856100

    Android四大组件全面解析,夯实基础。

    ①横竖屏切换 在横竖屏切换的过程中,会发生Activity被销毁并重建的过程。...但是需要注意的是,Service默认不会运行在子线程,它也不允许在一个独立进程中,它同样执行UI操作。因此不要在Service中执行耗时操作。除非Service中创建了子线程来完成耗时操作。...停止服务需要调用 stopService() 方法,服务停止的时候回调 onDestory被销毁。...退出以后线程还在,而如果 BroadcastReceiver 所在的进程结束了,该线程就会被标记为一个空线程,根据 Android 的内存管理策略,在系统内存紧张的时候,会按照优先级,结束优先级低的线程...而不是使用子线程的方法来解决,因为 BroadcastReceiver 的生命周期很短(在 onReceive() 执行后 BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver

    90230

    qt多线程编程实例_lgbt

    此函数不停止线程上运行的任何事件循环,并且在任何情况下都不会终止它。...可以用QObject::deleteLater(),它会投递一个DeferredDelete事件,这会被对象线程的事件循环最终选取到。假如没有事件循环运行,事件不会分发给对象。...QWaitCondition::wait() 接收一个mutex作为参数,mutex被调用线程初始化为锁定状态。在线程进入休眠状态之前,mutex会被解锁。...从另一个线程(不是QObject对象所属的线程)对该QObject对象调用delete方法是不安全的,除非能保证该对象在那个时刻不处理事件,使用QObejct::deleteLater()更好。...只能在堆空间创建线程对象,线程对象不能被外界主动销毁。 在run函数中最后调用deleteLater()函数。 线程函数主动申请销毁线程对象。

    1.5K10
    领券