大家好,今天小编关注到一个比较有意思的话题,就是关于java语言队列的问题,于是小编就整理了5个相关介绍Java语言队列的解答,让我们一起看看吧。
- 为什么说多级反馈队列调度算法能较好的满足各方面用户的需要?
- java线程池怎么配置最好?比如阻塞队列的选择?
- 常见的消息队列有哪些,它们之间有什么区别?
- JAVA架构之线程池是怎样工作的?
- 分布式、中间件和消息队列到底是怎么的一种工作模式?
为什么说多级反馈队列调度算法能较好的满足各方面用户的需要?
因为队列(Queue)是JAVA服务端程序常用到的概念,而且一般都会涉及多并发访问时的数据同步问题。以前在遇到这类问题时实现非常麻烦,***的是,Sun的j***a实现从1.5引入了一个非常有用的包j***a.util.concurrent,对类似的问题有了比较好的实现,今后不用再麻烦自己去写大段的代码了(有可能也隐藏一大堆bugs)。
因为在某一操作系统中对进程调度***用多级反馈队列调度算法。现设定***用***反馈队列调度算法,三个队列分别为I、II、III,对应时间片为2、4、8。现有四个进程A、B、C、D,到达时刻分别为0、5、7、12,执行时间分别为7、4、13、9。请写出整个进程调度过程,包括每个时间段,执行的进程,执行后进程状态,各个队列内进程的变化。
j***a线程池怎么配置最好?比如阻塞队列的选择?
我个人感觉,主要是根据业务场景和机器数量来配置。比如核心线程数,我一般是取当前机器核数。不过如果遇到高并发量的情况,还是要多设定一些为好。而队列,要结合业务来看,比如说,设置了***队列,但是并发请求量巨大,就可能导致内存飙升,最后oom。有界队列,要看你设置超过队列数量后任务的处理方式,直接抛弃,还是重试等。这也是根据业务本身来决定的。
以上,乃个人愚见,仅供参考。
常见的消息队列有哪些,它们之间有什么区别?
rabbitMQ:
RabbitMQ是基于Erlang语言编写的开源消息队列。RabbitMQ在数据一致性、稳定性和可靠性方面比较优秀,而且直接或间接的支持多种协议,对多种语言支持良好。但是其性能和吞吐量差强人意,由于Erlang语言本身的限制,二次开发成本较高。
kafka:
Kafka是LinkedIn于2010年12月开发并开源的一个分布式流平台,现在是Apache的顶级项目,是一个高性能跨语言分布式。快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐
ActiveMQ:
是Apache下的一个子项目,介于ZeroMQ和RabbitMQ之间。类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景而且只需付出低消耗。被誉为消息中间件的“瑞士军刀”。但是ActiveMQ不够轻巧,而且对于队列较多的情况支持不好,据说还 有丢消息的情况。
rocketMQ:
RocketMQ是阿里开源的消息中间件,目前在Apache孵化,使用纯J***a开发,具有高吞吐量、高可用性、适合大规模分布式
J***A架构之线程池是怎样工作的?
通俗易懂的给你解释一下,池塘里有很多鱼,我们捞一条上来把玩一番,把玩一段时间后放回池塘里去。这就是线程池的工作原理,只不过这个池塘里放的不是鱼,是一个个线程对象,用到一个就拿一个,用完放回池塘内,而这个池塘在计算机内就是对应在软件的内存中了。
ThreadPool工作原理任务先去核心线程池,如果核心线程池没有则存入到Q中;Q满了去启新的线程(启新线程时会全局锁),不能启的话就返回错误需要多了解些,参数配置和使用结合。
j***a.util.concurrent包中我们能找到线程池的定义,其中ThreadPoolExecutor是我们线程池核心类,首先看看线程池类的主要参数有哪些。
corePoolSize:线程池的核心大小,也可以理解为最小的线程池大小。
maximumPoolSize:最大线程池大小。
keepAliveTime:空余线程存活时间,指的是超过corePoolSize的空余线程达到多长时间才进行销毁。
unit:销毁时间单位。
workQueue:存储等待执行线程的工作队列。
threadFactory:创建线程的工厂,一般用默认即可。
handler:拒绝策略,当工作队列、线程池全已满时如何拒绝新任务,默认抛出异常。
线程池工作流程
1、如果线程池中的线程小于corePoolSize时就会创建新线程直接执行任务。
分布式、中间件和消息队列到底是怎么的一种工作模式?
分布式就是不部署在一个进程中,比如多台机器,甚至同台机器的不同进程中。
中间件除了自己写的代码和一些工具类库都可以叫中间件,比如数据库,开发框架,缓存,队列等
消息队列就是一个中间件,有生产的有消费的还有个消息暂存的,比如超市货架,超市往货架放东西,顾客取东西,货架就是暂存货物。
分别解释一下什么是分布式、中间件和消息队列;如果有说的不对的地方,请留言指正:
一个业务被拆成多个子业务,部署在多台服务器上,这个就叫做分布式。
我有一个系统A,提供一个很简单的[_a***_],根据员工编号查询员工姓名和他的考勤记录。
我拆开两个系统:人员管理系统B和考勤系统C,分别部署在两台服务器上。
这个需求,需要调用一下系统B,再调用一下系统C,最后得到需要的结果。
这个就是分布式。
举个例子:
我要开一家炸鸡店(业务端),需要鸡肉,有很多养鸡场(底层),我需要一个一个比较价钱,然后找一家性价比高的养鸡场合作(适配不同底层逻辑)。可能一段时间后,我需要重新选一家养鸡场合作,进货方式、交易方式等要重新制定(重新适配)。
分布式:
用于实现任务的分担,比如之前有一个办业务的窗口,随着客流量多,多开几个办理业务窗口,这样多个窗口,同时工作,分担任务。
这时会出现问题了,那么多个窗口,客户来了该去那个窗口,这个时候会让客户去取号机,取号,其实取号机就是中间件的角色,只是类似消息队列的中间件。
分布式要解决的问题很多,其中两个最重要的是:分布式锁和分布式事务。可以参考我发的文章。
中间件:
简单来说就是一座桥,是连接各方的中枢。
到此,以上就是小编对于j***a语言队列的问题就介绍到这了,希望介绍关于j***a语言队列的5点解答对大家有用。