自己设计线程池要从哪些方面考虑(线程池必须要会的10道面试题)
发布时间:2023-07-10 10:54:52来源:网络转载
ThreadPoolExecutor有如下常用方法:submit()/execute():执行线程池shutdown()/shutdownNow():终止线程池isShutdown():判断线程是否终止getActiveCount():正在运行的线程数getCorePoolSize():获取核心线程数getMaximumPoolSize():获取最大线程数getQueue():获取线程池中的任务队列allowCoreThreadTimeOut(boolean):设置空闲时是否回收核心线程 这些方法可以用来终止线程池、线程池监控等。 面试题2:说说submit(和 execute两个方法有什么区别? submit() 和 execute() 都是用来执行线程池的,只不过使用 execute() 执行线程池不能有返回方法,而使用 submit() 可以使用 Future 接收线程池执行的返回值。 面试题3:shutdownNow() 和 shutdown() 两个方法有什么区别? shutdownNow() 和 shutdown() 都是用来终止线程池的,它们的区别是,使用 shutdown() 程序不会报错,也不会立即终止线程,它会等待线程池中的缓存任务执行完之后再退出,执行了 shutdown() 之后就不能给线程池添加新任务了;shutdownNow() 会试图立马停止任务,如果线程池中还有缓存任务正在执行,则会抛出 java.lang.InterruptedExceptIOn: sleep interrupted 异常。 面试题4:了解过线程池的工作原理吗? 当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了最大线程数,就会执行拒绝执行策略。 面试题5:线程池中核心线程数量大小怎么设置? 「CPU密集型任务」:比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。尽量使用较小的线程池,一般为CPU核心数 1。因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,会造成CPU过度切换。 「IO密集型任务」:比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间。可以使用稍大的线程池,一般为2*CPU核心数。IO密集型任务CPU使用率并不高,因此可以让CPU在等待IO的时候有其他线程去处理别的任务,充分利用CPU时间。 另外:线程的平均工作时间所占比例越高,就需要越少的线程;线程的平均等待时间所占比例越高,就需要越多的线程; 以上只是理论值,实际项目中建议在本地或者测试环境进行多次调优,找到相对理想的值大小。 面试题6:线程池为什么需要使用(阻塞)队列? 主要有三点:因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。创建线程池的消耗较高。 面试题7:线程池为什么要使用阻塞队列而不使用非阻塞队列? 阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。 当队列中有任务时才唤醒对应线程从队列中取出消息进行执行。 使得在线程不至于一直占用cpu资源。 (线程执行完任务后通过循环再次从任务队列中取出任务进行执行,代码片段如下 while (task != null || (task = getTask()) != null) {})。 不用阻塞队列也是可以的,不过实现起来比较麻烦而已,有好用的为啥不用呢? 面试题8:了解线程池状态吗? 通过获取线程池状态,可以判断线程池是否是运行状态、可否添加新的任务以及优雅地关闭线程池等。 RUNNING:线程池的初始化状态,可以添加待执行的任务。SHUTDOWN:线程池处于待关闭状态,不接收新任务仅处理已经接收的任务。STOP:线程池立即关闭,不接收新的任务,放弃缓存队列中的任务并且中断正在处理的任务。TIDYING:线程池自主整理状态,调用 terminated() 方法进行线程池整理。TERMINATED:线程池终止状态。 面试题9:知道线程池中线程复用原理吗? 线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。 在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对 Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停的检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式将只使用固定的线程就将所有任务的 run 方法串联起来。 面试题10:说说线程池创建需要的那几个核心参数的含义 ThreadPoolExecutor 最多包含以下七个参数:corePoolSize:线程池中的核心线程数maximumPoolSize:线程池中最大线程数keepAliveTime:闲置超时时间unit:keepAliveTime 超时时间的单位(时/分/秒等)workQueue:线程池中的任务队列threadFactory:为线程池提供创建新线程的线程工厂rejectedExecutionHandler:线程池任务队列超过最大值之后的拒绝策略总结 本文通过没有使用线程池带来的弊端,Executors介绍,Executors的六种方法介绍、如何使用线程池,了解线程池原理,核心参数,以及10到线程池面试题。 「成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。」
(责编: admin)
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
-
易烊千玺夜景随拍 四字真是妥妥文艺男啊
【易烊千玺夜景随拍, 四字真是妥妥文艺男啊】20日,易烊千玺在社交平台分享的夜景随拍照。四字确实是妥妥文艺男青年啊。[详细] -
2023年第一季度5部高分剧,《狂飙》排在第三,你追过哪几部?
第五部《显微镜下的大明之丝绢案》 豆瓣:7 8 主演:张若昀、王阳 剧情点评:一开始感觉有点无聊,但是后续渐入佳境。特别印象深刻的是邓知县和帅家...[详细] -
原创舞台剧《魔域·亚特之光》首演 共赴“爱与和平”成长征途
舞台剧《魔域·亚特之光》剧组 张帆 摄 中新网北京8月19日电 (记者 应妮)全新原创舞台剧《魔域·亚特之光》19日晚在北京天桥艺术中 [详细] -
众多电影人江西庐山推荐中国影史经典爱情电影
中新网庐山8月21日电 (记者 吴鹏泉 姜涛)第三届庐山国际爱情电影周主题盛典20日晚在江西庐山举行,众多电影人在活动中推荐中国影史经 [详细] -
直击义乌疫情:病毒隐匿性更强 一县支援一镇保供
发布会现场。 金华发布 供图 (抗击新冠肺炎)直击义乌疫情:病毒隐匿性更强 一县支援一镇保供 中新网金华8月14日电 (记者 张斌)8 [详细]