优先级队列

呆萌数据结构 | 04 队列

北战南征 提交于 2020-01-15 07:04:29
原文来自 萌一小栈 生活中的一些排队行为,基本上都是队列的形式。这篇博客涉及的概念有 队列 , 循环队列 , 优先队列 , 双端队列 。 很多编程语言已经内置了队列结构,在实际项目中可以直接使用。这篇文章里的代码实现,主要用做原理理解。 拿超市买单为例,买完东西,一般会找一个结账台排队,等待结账。如果前面已经有人在排队,那你肯定是排在当前队伍的最后面,如果再来人,肯定是排在你的后面,依次往后排。每当有一个顾客买完单,那后面的顾客就会往前走,直到整个买单队伍没有人排队。这就是队列结构。是不是很简单~ 队列 队列,是一种先进先出的结构(First in first out),也就是在队尾进行插入操作,在队头进行删除操作。队列可以用链表来实现,也可以用数组来实现,要根据实际需求来决定。 队列的操作有 入列 、 出列 、 判断是否为空 、 判断是否已满 等操作。下面将用C#来实现列表结构,看代码 public class Node { public int data; public Node next; public Node(int data) { this.data = data; } } public class LinkedListQueue { public Node head; public Node tail; // 插入一个元素 public void Enqueue

ThreadPoolExecutor线程池

a 夏天 提交于 2020-01-15 00:28:16
一:类继承结构 继承关系 二:构造函数 构造函数 (1)线程池的大小除了显示的限制外,还可能由于其他资源上的约束而存在一些隐式限制。比如JDBC连接池。 (2)运行时间较长的任务。 如果任务阻塞的时间过长,即使不出现死锁,线程池的响应性也会变得糟糕。执行时间较长的任务不仅会造成线程池阻塞,甚至还会增加执行时间。如果线程池中线程的数量远小于在稳定状态下执行时间较长任务的数量,那么到最后可能所有的线程都会运行这些执行时间较长的任务,从而影响整体的响应性。 有一项技术可以缓解执行时间较长任务造成的影响,即限定任务等待资源的时间,而不要无限制地等待。在平台类库的大多数可阻塞方法中,都同时定义了限时版本和无限时版本,例如:Thread.join,BlockingQueue.put,CountDownLatch.await以及Selector.select等。如果等待超时,可以把任务标识为失败,然后中止任何或者将任务重新放回队列以便随后执行。如果在线程池中总是充满了呗阻塞的任务,那么也可能表示线程池的规模过小。 (3)设置线程池的大小 (3.1)线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime.availableProcessors来动态计算。 (3.2)要设置线程池的大小也并不困难,只需要避免“过大

线程池分享

醉酒当歌 提交于 2020-01-13 06:45:51
1.线程池简介 什么是线程池: 线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。 线程池作用: 一个是限制线程的数量,不会导致线程的膨胀,防止消耗过多内存; 二是线程复用,线程执行完一个人任务之后,可以接着执行下一个任务,减少了创建线程的开销; 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程和销毁线程就会大大降低系统的效率。 2.JAVA线程池详解 一、简介: 线程池中最核心的类便是ThreadPoolExecutor,而AbstractExecutorService、ExecutorService和Executor是对应的父类和接口。通过Executors工具类可以创建一些常用的线程池。 二、线程池状态 RUNNING、SHUTDOWN、STOP、TERMINATED4个状态。 当创建线程池后,初始时,线程池处于RUNNING状态; 如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕; 如果调用了shutdownNow()方法,则线程池处于STOP状态

线程池的使用

99封情书 提交于 2020-01-13 01:06:33
线程池的创建(I) 我们可以通过 ThreadPoolExecutor 创建一个线程池 public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long keepAliveTime , TimeUnit unit , BlockingQueue < Runnable > workQueue , RejectedExecutionHandler handler ) 创建线程池时有几个核心参数需要了解下: corePoolSize :线程池的核心数量。当一个任务提交到线程池时,线程池会创建一个线程来执行任务,即使当前有空闲的线程能够执行新任务,线程池还是会创建新的线程,直到需要执行的任务数大于核心数量就不再创建 maximumPoolSize :线程池最大数量。线程池所能允许创建的最大线程数,如果队列满了,并且已创建的线程小于最大线程数,线程池还会继续创建线程 keepAliveTime :线程活动保持时间。线程池中的线程工作结束后的保持存活的时间,超过这个时间还没有任务执行,线程就会被销毁 TimeUnit : 时间单位。线程活动保持时间的时间单位 workQueue :任务队列,用于保存等待执行的任务的阻塞队列,当任务的数量大于核心数量时,就会将任务暂时保存在任务队列中,如果队列也满了且没超过最大数量

Libevent初探

℡╲_俬逩灬. 提交于 2020-01-12 17:02:08
  Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。   Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。Libevent之于C语言网络编程,类似于Nettty之于Java Web编程。学习Netty的小伙伴,不防看下Libevent的实现,会加深对Netty框架的理解~   Libevent的安装教程网上较多,LZ在此就不再赘述,下面直接来点干货-Libevent如何使用。 检查Libevent支持的IO复用方法   Libevent作为一个高性能网络库,内部封装了多种IO复用技术,如果想看下Libevent在当前系统下支持哪些IO复用技术呢? int main(int argc, char **argv) { // 版本信息 cout << event_get_version() << endl; //

php队列的实现思路和详细过程

你。 提交于 2020-01-10 13:49:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、队列使用场景:为什么需要队列 在web开发中,我们经常会遇到需要处理批量任务的时候,这些批量任务可能是用户提交的,也可能是当系统被某个事件触发时需要进行批量处理的,面对这样的 任务,如果是用户提交的批量任务,初级程序员只能让用户触发提交动作后,等待服务器处理完毕,并且将结果返回到浏览器,期间用户不能关掉浏览器窗口,如果 数据比较大,或者处理速度比较慢,那用户体验将会因此受到直接影响。但是当我们使用某讯或者某浪的邮箱时,点击群发邮件之后,只需等待很短的时间,浏览器 提示提交成功,正在发送之类的信息时,用户就可以关掉浏览器,稍后,收件地址栏里的邮箱将陆续收到该群发邮件,再比如群发定时邮件,以及当商城系统中有客 户下单,客户,客服,仓库等相关人员收到订单邮件信息。诸如此类,队列的应用范围是如此之广。 二 :普通工程师的解决方案和架构师的解决方案 方案1:建表存邮件,消息等,用定时程序取出发送。 方案2:抽象到更高一层,开发一套通用异步处理队列适用于任何复杂的业务逻辑 那么,作为架构师,使用队列的做法,将抽象层和业务层分离,可具有良好的扩展性和可维护性。相比较而言就高明了许多,下面就我们介绍一下自定义队列的实现思路和方法。 三 :队列总体设计 1:需要队列程序,提供加入队列接口和取队列接口等 2:需要存储队列

Python 学习之队列问题

☆樱花仙子☆ 提交于 2020-01-10 13:22:49
Python四种类型的队例: Queue:FIFO 即first in first out 先进先出 LifoQueue:LIFO 即last in first out 后进先出 PriorityQueue:优先队列,级别越低,越优先deque:双边队列 导入三种队列,包 from queue import Queue,LifoQueue,PriorityQueue #基本FIFO队列 先进先出 FIFO即First in First Out,先进先出 #maxsize设置队列中,数据上限,小于或等于0则不限制,容器中大于这个数则阻塞,直到队列中的数据被消掉 q = Queue(maxsize=0) #写入队列数据 q.put(0) q.put(1) q.put(2) #输出当前队列所有数据 print(q.queue) #删除队列数据,并返回该数据 q.get() #输也所有队列数据 print(q.queue) # 输出: # deque([0, 1, 2]) # deque([1, 2]) #LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上 lq = LifoQueue(maxsize=0) #队列写入数据 lq.put(0) lq.put(1) lq.put(2) #输出队列所有数据 print(lq.queue)

线程池的正确打开方式

风格不统一 提交于 2020-01-10 11:56:54
欢迎关注微信公众号: 程序员小圈圈 原文首发于: www.zhangruibin.com 本文出自于: RebornChang的博客 转载请标明出处^_^ 线程池的正确打开方式 线程,线程池,多线程,锁,老生常谈的知识点了,涉及很多知识,本节为笔者自己整理的知识点,方便学习记忆,分享出来仅供参考。 线程相关 线程与进程 线程是什么,进程是什么,这是很多初学者的疑问,当然老鸟大神请忽略,这里就简单的比喻下。 如果说把进程比作一条单向路,那线程就是这条路上的通道,比如高速公路单向四通道,可以看成单进程,四线程。 那么所谓的进程线程落到我们电脑硬件上是按什么划分的呢? 我们买电脑的时候,经常看到电脑参数配置里面有这样的介绍: 双核4线,八核16线之类的,这个核就是指的CPU数,几线,就是同时处理的最大线程数,说是八核十六线程的电脑,在使用起来可以达到最大并发16线程,但是,那只是使用起来,究其根本,还是执行的八核八线,只是说在处理速度跟运行效果上,可以达到使用级别的八核十六线,很简单的一个例子,电脑的任务管理器,试试看你的电脑能同时打开几个。 线程的创建和运行方式有几种 如果您是撸了两三年代码的老鸟,这里就可以忽略了。 笼统的来说,线程的创建方式分为四种。 笔者先说下自己知道的,然后具体分为几种,仁者见仁智者见智吧。 第一种,大家公认的,就是继承Thread类进行线程的创建; 第二种

DPDK QoS之分层调度器

喜欢而已 提交于 2020-01-10 04:54:44
原创翻译,转载请注明出处。 分层调度器的时机主要体现在TX侧,正好在传递报文之前。它的主要目的是在每个网络节点按照服务级别协议来对不同的流量分类和对不同的用户的报文区分优先级并排序。 一、概述 分层调度器跟以前使用网络处理器实现的每条流或一组流的报文队列和调度的流量管理器很相似。它看起来像在传输之前的一个临时存储了很大数量报文的缓冲区(入队操作)。当网卡TX请求更多报文去发送的时候,这些报文递交给网卡TX的预定义的SLA的报文选择逻辑模块之后会删除。(出队操作)。 分层调度器对大数量的报文队列做了优化。当只需要小数量的队列时,会使用消息传递队列来替代。更多详情参考"Worst Case Scenarios for Performance"。 二、分层调度 如下图: 分层的第一级是 Ethernet TX 1/10/40端口,之后的分级是子端口,流水线,流分类和队列。 有代表性的是,每一个子端口表示一个预定义好的用户组,而每一个流水线表示一个个人用户。每一个流分类表示不同的流量类型,流量类型包含了具体的丢包率,时延,抖动等需求,比如语音,视频或数据传输。每一个队列从一到多个相同用户相同类型的连接里接待(原文是动词:host)报文。 下面的表格对每个分层做了功能描述: # 级别 兄弟 功能描述 1 Port 0 1、以太端口1/10/40 GbE输出; 2、多个端口具有相同的优先级

面试(二)

陌路散爱 提交于 2020-01-09 18:51:32
4.介绍一下java的数据结构,然后手写一个栈的类 主要可以分为两类: 1)Java中定义了一个接口collection,用来存储一个元素集合 2)另一种是定义了映射(map)用来存储键/值对。 Collection接口为线性表(list)、向量(vector)、栈(stack)、队列(queue)、优先队列(priority queue)以及规则集(set)定义了通用的操作 Set(规则集) 用于存储一组不重复的元素。 重要的实现类: HashSet 。 List(线性表) 用于存储一个有序元素的集合(允许重复)。两个重要的实现类: ArrayList (数组线性表类)和 LinkedList (链表类)。 Stack(栈) 用于存储采用后进先出方式处理的对象。 Queue(队列) 用于采用先进先出方式处理的对象。不过队列用双向链表 LinkedList 实现更好 PriorityQueue用于存储按照优先级顺序处理的对象。 map(映射)是一个存储“键/值对”集合的容器对象。键很像索引,在List中,索引是整数;在Map中,键可以是任意类型的对象。映射中不能有重复的键,每个键都对于一个值。 线性表、栈、队列、优先队列: ArrayList、LinkedList 都是线程不安全的 。 vector是线程安全的。 ArrayList :用数组存储元素。这个数组是动态创建的