优先级队列

ThreadPoolExecutor详解(二)

巧了我就是萌 提交于 2020-03-04 00:14:31
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。 下面我们就对ThreadPoolExecutor的使用方法进行一个详细的概述。 首先看下ThreadPoolExecutor的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory

网络流量控制与管理

这一生的挚爱 提交于 2020-03-03 07:20:23
早期的网络建设中,更多的注意力放在网络的连通性上,只要两点之间能够通过网络连接通讯,就达到目的。并且当时的网络带宽只有10Mbps,甚至还是共享的方式。随着科技技术以及网络应用的发展,越来越多的企业业务依靠于计算机网络,网络就是企业的生命。 网络流量的急剧增加,一方面促进了网络技术的发展,比如从共享10Mbps到交换10Mbps、100Mbps、1000Mbps,甚至10Gbps以太网标准也已经完成。另一方面,网络带宽如何合理、高效、充分的利用也是今天人们谈论得越来越多的话题。 目前,在网络规划中存在3种高效的技术有助于网络流量的管理和控制,它们分别是流控机制、服务质量 (QoS) 和组播技术。但是,拥塞管理和避免机制是最终实现服务质量的手段。 拥塞管理指队列机制。常见的拥塞管理机制包括: 先进先出,优先级队列,循环队列,加权循环队列等等。 先进先出 (FIFO): 实际上无队列或只有一个队列。只有在网络拥塞时缓存数据包,无优先级可言,所有数据包都同等对待。在这种机制下,突发数据包或故障数据包有可能抢占掉所有带宽。建议用于带宽很高,几乎不存在流量拥塞的环境中。 优先级队列 (PQ): 定义优先级队列,并按照优先级的次序处理。只有处理完高优先级队列中的数据包之后,才处理低优先级队列。每转发一个数据包,都要进行一次队列扫描。其结果是: 虽然可以提供优先级服务

java 阻塞队列小结

一世执手 提交于 2020-03-02 16:47:42
阻塞队列 说到队列,他有一个很显著的特点就是 先进先出 ,由此利用这种特性,可以用来进行处理完成一些操作。阻塞队列就是其中之一 下面就是java中定义的接口 * @since 1.5 * @author Doug Lea * @param < E > the type of elements held in this collection * / public interface BlockingQueue < E > extends Queue < E > { 它的主要方法如下: 作用 它的作用概括起来就是 添加到满时无法添加进行等待/ 报异常/ 返回是否成功 获取到空时无法获取进行等待/ 报异常/ 返回是否成功 就其实现之一的ArrayBlockingQueue而言 ArrayBlockingQueue 添加与删除时 public static void main ( String [ ] args ) throws InterruptedException { BlockingQueue < String > blankQueue = new ArrayBlockingQueue < > ( 5 ) ; blankQueue . take ( ) ; // 一直等待直到有值 blankQueue . remove ( ) ; //java.util

线程池的学习

蹲街弑〆低调 提交于 2020-03-02 02:39:01
以下为个人的学习和总结,如果只是为了了解线程池,可以谷歌到大量优秀的文章.这里只是为了记录我的学习思路,参考的其他人的博客 . ,有些归纳不正确之处望斧正 我会不断归纳总结新看到的文章来丰富细节 为什么我们要用线程池 除了用线程池代码看起来比较高大上这个理由外,先说说用线程池和不用线程池相比都有什么好处吧 我就用大白话解释了,总比复制粘贴死记硬背好些吧...... 降低资源消耗 创建和销毁线程是有成本消耗的.线程池正是为了解决线程生命周期开销问题和资源不足问题 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 这就像一次性筷子和食堂用的消毒筷子一样,没必要每个人吃完饭就把筷子销毁重新做(虽然实际上这样相对比较卫生......吧?) 提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 还是拿筷子解释吧(和食堂筷子卯上了),线程池就像装筷子的消毒柜,用时直接拿,用完再放回去.没必要来个人吃饭(执行任务)就说:我们在给你准备一双新筷子(创建新线程),你先等一下...... 提高线程的可管理性 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 消毒柜里统一发放用完后洗过(回收)的筷子(线程),而不是来个人就弄一双筷子,到最后筷子扔的到处都是

iOS多线程之GCD

这一生的挚爱 提交于 2020-03-01 22:46:57
1.简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核、四核) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 2.任务和队列 GCD有两个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用有两个步骤 定制任务 确定想做的事情 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 3.执行任务 GCD中有2个用来执行任务的函数 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 4.队列的类型 并发队列 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在异步

Java多线程-工具篇-BlockingQueue

China☆狼群 提交于 2020-03-01 01:45:07
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示: 从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出; 常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种)   先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。   后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内

Executors常用的创建ExecutorService的方法的简单说明

荒凉一梦 提交于 2020-02-29 19:49:04
一、线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池。 Java代码 ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 创建一个线程池需要输入几个参数: corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会 创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创 建并启动所有基本线程。 runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列。 ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。 LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。

RabbitMQ入门

你。 提交于 2020-02-28 18:47:58
文章目录 一、rabbitMQ简介 各大主流中间件对比: 初识RabbitMQ RabbitMQ高性能的原因? 什么是AMQP高级消息队列协议? AMQP核心概念(重点) 二、rabbitMQ安装及使用(两种) Centos安装方式 Docker安装方式 常用操作命令 三、rabbitMQ快速入门 四、交换机 直流交换机 主题交换机 输出交换机 一、rabbitMQ简介 各大主流中间件对比: ActiveMQ ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线,并且它一个完全支持 J M S 规范的消息中间件。 其丰富的 API 、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛! MQ 衡量指标:服务性能、数据存储、集群架构 Kafka 用来做日志分析的 RocketMQ RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目,它是纯java开发,具有高吞吐量、高可用性、适合大规模分布式系统 应用的特点。 RocketMQ思路起源于Kafka,它对消息的可靠传输及事务 性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推 送、日志流式处理、binglog分发等场景 RabbitMQ RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议 来实现。 AMQP的主要特征是面向消息

MQ技术

二次信任 提交于 2020-02-28 14:53:08
MQ技术(消息队列) 消息中间件概述 消息队列技术是分布式应用间交换信息的一种技术。 消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。 通过消息队列,应用程序可独立地执行–它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。 消息队列为构造以同步或异步方式实现的分布式应用提供了松耦合方法。 消息队列的API调用被嵌入到新的或现存的应用中,通过消息发送到内存或基于磁盘的队列或从它读出而提供信息交换。 消息队列可用在应用中以执行多种功能,比如要求服务、交换信息或异步处理等。 消息队列的四大好处: 1.解耦:每个成员不必受其他成员影响,可以更独立自主,只通过一个简单的容器来联系。 2.提速 3.广播 4.削峰 消息队列的成本: 1.引入复杂度 2.暂时的不一致性 中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络通讯。 它在计算机系统中是一个关键软件,它能实现应用的互连和互操作性,能保证系统的安全、可靠、高效的运行。 中间件位于用户应用和操作系统及网络软件之间,它为应用提供了公用的通信手段,并且独立于网络和操作系统。 中间件为开发者提供了公用于所有环境的应用程序接口,当应用程序中嵌入其函数调用,它便可利用其运行的特定操作系统和网络环境的功能,为应用执行通信功能。 如果没有消息中间件完成信息交换

并发编程之线程池ThreadPoolExecutor

不打扰是莪最后的温柔 提交于 2020-02-28 02:16:59
前言 在我们平时自己写线程的测试demo时,一般都是用new Thread的方式来创建线程。但是,我们知道创建线程对象,就会在内存中开辟空间,而线程中的任务执行完毕之后,就会销毁。 单个线程的话还好,如果线程的并发数量上来之后,就会频繁的创建和销毁对象。这样,势必会消耗大量的系统资源,进而影响执行效率。 所以,线程池就应运而生。 线程池ThreadPoolExecutor 可以通过idea先看下线程池的类图,了解一下它的继承关系和大概结构。 它继承自AbstractExecutorService类,这是一个抽象类,不过里边的方法都是已经实现好的。然后这个类实现了ExecutorService接口,里边声明了各种方法,包括关闭线程池,以及线程池是否已经终止等。此接口继承自父接口Executor,里边只声明了一个execute方法。 线程池就是为了解决单个线程频繁的创建和销毁带来的性能开销。同时,可以帮我们自动管理线程。并且不需要每次执行新任务都去创建新的线程,而是重复利用已有的线程,大大提高任务执行效率。 我们打开 ThreadPoolExecutor的源码,可以看到总共有四个构造函数。 但是,前三个最终都会调用到最后一个构造函数。我们来看下这个构造函数都有哪些参数。(其实,多看下参数的英文解释就能明白其中的含义,看来英语对程序员来说是真的重要呀) //核心构造函数 public