大家好,今天小编关注到一个比较有意思的话题,就是关于java语言Queue的问题,于是小编就整理了3个相关介绍Java语言Queue的解答,让我们一起看看吧。
JAVA架构之线程池是怎样工作的?
java.util.concurrent包中我们能找到线程池的定义,其中ThreadPoolExecutor是我们线程池核心类,首先看看线程池类的主要参数有哪些。
corePoolSize:线程池的核心大小,也可以理解为最小的线程池大小。
maximumPoolSize:最大线程池大小。
keepAlivetime:空余线程存活时间,指的是超过corePoolSize的空余线程达到多长时间才进行销毁。
unit:销毁时间单位。
threadFactory:创建线程的工厂,一般用默认即可。
Handler:拒绝策略,当工作队列、线程池全已满时如何拒绝新任务,默认抛出异常。
线程池工作流程
1、如果线程池中的线程小于corePoolSize时就会创建新线程直接执行任务。
ThreadPool工作原理任务先去核心线程池,如果核心线程池没有则存入到Q中;Q满了去启新的线程(启新线程时会全局锁),不能启的话就返回错误需要多了解些,参数配置和使用结合。
通俗易懂的给你解释一下,池塘里有很多鱼,我们捞一条上来把玩一番,把玩一段时间后放回池塘里去。这就是线程池的工作原理,只不过这个池塘里放的不是鱼,是一个个线程对象,用到一个就拿一个,用完放回池塘内,而这个池塘在计算机内就是对应在软件的内存中了。
java线程池怎么配置最好?比如阻塞队列的选择?
我个人感觉,主要是根据业务场景和机器数量来配置。比如核心线程数,我一般是取当前机器核数。不过如果遇到高并发量的情况,还是要多设定一些为好。而队列,要结合业务来看,比如说,设置了***队列,但是并发请求量巨大,就可能导致内存飙升,最后oom。有界队列,要看你设置超过队列数量后任务的处理方式,直接抛弃,还是重试等。这也是根据业务本身来决定的。
面试:Handler的工作原理是怎样的?
Handler机制工作原理:
Handler 工作流程基本包括 Handler、Looper、Message、MessageQueue 四个部分。但我们在日常开发中,经常都只会用到 Handler 和 Message 两个类。Message 负责消息的搭载,里面有个 target 用于标记消息,obj 用于存放内容,Handler 负责消息的分发和处理。
下面具体给你讲解一下:
Handler机制是由Looper和MessageQueue来构建消息机制的。
MessageQueue:消息队列。虽然名为队列,但事实上它的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表的,其中主要有插入enqueue()和从中拿走并删除next()两个方法。
Looper:消息循环。MessageQueue来存储消息,Looper则是以无限循环的方式去查找是否有新消息,如有就去处理,若没有就standby(等待)。一个线程创建Handler时首先需要创建Looper的,不然报错:RuntimeException: No Looper; Looper.prepare() wasn't called on this thread,而且每个线程下只需要创建一个Looper,不然会报错:RuntimeException: Only one Looper may be created per thread。
面试中回答,建议能自己总结一套自己的专属答案,并理解透,那样当遇到这个问题,就能回答的游刃有余!
到此,以上就是小编对于java语言Queue的问题就介绍到这了,希望介绍关于java语言Queue的3点解答对大家有用。