优先级队列

多线程编程学习十一(ThreadPoolExecutor 详解).

眉间皱痕 提交于 2020-02-09 18:27:46
一、ThreadPoolExecutor 参数说明 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) corePoolSize:核心线程池的大小。当提交一个任务到线程池时,核心线程池会创建一个核心线程来执行任务,即使其他核心线程能够执行新任务也会创建线程,等到需要执行的任务数大于核心线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法,核心线程池会提前创建并启动所有核心线程。 workQueue:任务队列。当核心线程池中没有线程时,所提交的任务会被暂存在队列中。Java 提供了多种 阻塞队列 。 maximumPoolSize:线程池允许创建的最大线程数。如果队列也满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的空闲线程执行任务。值得注意的是,如果使用了无界的任务队列则这个参数不起作用。 keepAliveTime:当线程池中的线程数大于 corePoolSize 时

线程池-线程池的好处

人走茶凉 提交于 2020-02-09 18:21:06
ThreadPoolExecutor类 简介   java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。 ThreadPoolExecutor 的4个构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { this(corePoolSize, maximumPoolSize,

线程与进程

时间秒杀一切 提交于 2020-02-09 00:06:56
一、线进程若干概念 1.并发:程序,任务,用户 2.多道程序设计:A_IO阻塞----->切换到B_通道----->B_IO阻塞------>切换到C_通道 3.spooling(外部设备联机并行操作):它是Simultaneous Peripheral Operations On-Line的缩写,它是关于慢速 字符设备 如何与计算机主机交换信息一种技术,通常称为“ 假脱机 技术”。原理就是当一个额外的设备送到内存等待区域时,当操作系统处理完一个事件后,额外设备中的事件可以迅速被操作系统读出,装进空出来的内存区运行。 二、实例导入: 线程:threading.Thread(target=函数名,args=形参名) import threading from time import ctime, sleep import time def ListenMusic(name): print("Berlin listening to %s. %s" %(name,ctime())) sleep(3) print("end listening %s"%ctime()) def RecordBlog(title): print("Begin recording the %s! %s"%(title,ctime())) sleep(5) 线程和进程若干方法 1.守护线程Setdaemon t1

40个Java多线程问题总结

▼魔方 西西 提交于 2020-02-08 22:14:31
前言 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题

数据结构之队列的使用 + 面试题

ε祈祈猫儿з 提交于 2020-02-07 14:05:15
数据结构之队列的使用 + 面试题 队列(Queue):与栈相对的一种数据结构, 集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。 Queue 类关系图,如下图所示: 注:为了让读者更直观地理解,上图为精简版的 Queue 类关系图。本文如无特殊说明,内容都是基于 Java 1.8 版本。 队列(Queue) 1)Queue 分类 从上图可以看出 Queue 大体可分为以下三类。 双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取。 阻塞队列:阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行。例如,当添加元素时,如果队列元素已满,队列会阻塞等待直到有空位时再插入。 非阻塞队列:非阻塞队列和阻塞队列相反,会直接返回操作的结果,而非阻塞等待。双端队列也属于非阻塞队列。 2)Queue 方法说明 Queue 方法如下图所示: 其中比较常用的方法有以下几个: add(E):添加元素到队列尾部,成功返回 true,队列超出时抛出异常; offer(E):添加元素到队列尾部,成功返回 true,队列超出时返回 false; remove(Object):删除元素,成功返回 true

MQ产品比较-ActiveMQ-RocketMQ

人走茶凉 提交于 2020-02-05 14:16:20
转载自:http://www.coin163.com/good/blog/mq.html 几种MQ产品说明: ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erlang语言本身的并发优势,性能较好,但是不利于做二次开发和维护 ActiveMQ : 历史悠久的开源项目,已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多).,支持持久化到数据库,对队列数较多的情况支持不好,不过我们的项目中并不会建很多的队列. Redis 做为一个基于内存的K-V数据库,其提供了消息订阅的服务,可以当作MQ来使用,目前应用案例较少,且不方便扩展 RocketMQ : 阿里巴巴的MQ中间件,在其多个产品下使用,并能够撑住双十一的大流量,他并没有实现JMS规范,使用起来很简单。部署由一个 命名服务(nameserver)和一个代理(broker)组成,nameserver和broker以及producer都支持集群,队列的容量受机器硬盘的限制,队列满后可以支持持久化到硬盘(也可以自己适配代码,将其持久化到NOSQL数据库中),队列满后会影响吞吐量,可以采用主备来保证稳定性,支持回溯消费

数据结构--树(下) 堆、哈夫曼树、哈夫曼编码、并查集

ぃ、小莉子 提交于 2020-02-04 03:13:26
堆(heap) 讲线性结构队列中有提到一种队列叫优先队列(Priority Queue),取出元素是依照元素的优先权大小,而不是元素进入队列的优先顺序。 如何组织优先队列? 我们用完全二叉树去表示优先队列,任一结点都是其子树的最大值/最小值,这就叫堆,堆分为大顶堆和小顶堆,从名字也可看出,大顶对对应的结点顶部为最大值,小顶堆同理。 大顶堆 : 小顶堆 : 堆的两个特性 结构性:用数组表示的完全二叉树 有序性:任一结点的关键字是其子树所有结点的最大值/最小值 堆的抽象数据类型描述 类型名称:最大堆 数据对象集:完美二叉树,每个结点的元素值不小于其他子结点的元素值 操作集: •MaxHeap Create( int MaxSize ):创建一个空的最大堆。 •Boolean IsFull( MaxHeap H ):判断最大堆H是否已满。 •Insert( MaxHeap H, ElementType item ):将元素item插入最大堆H。 •Boolean IsEmpty( MaxHeap H ):判断最大堆H是否为空。 •ElementType DeleteMax( MaxHeap H ):返回H中最大元素(高优先级)。 堆结构 : typedef struct heapsturct { ElementType * Elements ; //0位置存放一个值为无穷大的哨兵

0512 操作系统进程调度实验

我只是一个虾纸丫 提交于 2020-02-04 02:33:17
实验三进程调度模拟程序 专业:商软2班 姓名:韩麒麟 学号:201406114253 一. 目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 1.2. 实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。 (1). 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 (2). 进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。 (3). 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。 (4). 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 (5). 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。 (6). 每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查

数据结构和java容器实现小结

依然范特西╮ 提交于 2020-01-31 21:26:25
数组 连续分配的内存块 一维数组 多维数组 自动扩容功能 链表 分散分配的内存块 单链表 双向链表 循环链表 单向循环链表 双向循环链表 队列 (链表的子集) 先进先出视为队列,队列的功能可以被链表覆盖。 单向先进先出队列 双线先进先出队列 循环队列(仅数组实现) 优先级队列 (使用堆实现) 栈 (链表的子集) 先进后出视为栈 同上,可以被链表覆盖 树 (链表的父级) 树的节点有一个父节点和多个子节点的数据结构。 链表是有一个父节点并且只有一个子节点的特殊的树 不同树结构的区别。 有序/无序 有权/无权 子节点上限(2个,3个,多个等) 是否自平衡(最低层和最高层层级差不超过1) 二叉树 (最多有2个子节点) 完全二叉树 (只有叶子层节点不满,上层节点已满) 最小/大堆 满二叉树(每个节点都有2个子节点) 二叉查找树(左子节点<根节点<=右子节点,有序的二叉树) 平衡二叉查找树 红黑树 AVL树 多叉树 有多个子节点 B树 B+树 B*树 B-树 字典树 trie树 前缀树 后缀树 贴个图 还有其他的: BKD-树 (elasticsearch 中用于存储整数并且快速查找) 相关算法: 前/中/后序遍历 图(树的父集) 图表示节点和节点之间的关系,不限制父节点和子节点的个数 图和图的区分 有向/无向 有环/无环 完全/不完全 有权/无权 相关概念 无向图 有向图 完全图

spring event机制

萝らか妹 提交于 2020-01-31 15:49:45
Spring增加了event事件机制,方便了日常项目中需要业务解藕的开发场景,也支持异步和重试机制,很多场景都可以使用 目前开发的项目中需要记录一些异常单据信息的记录,主流程中正常单据接单的流程不动,在识别出某种异常后记录,但是这种记录不应该影响主流程,所以考虑用Spring的event异步事件处理 1.什么是事件机制 Java的设计模式中有两种设计模式,观察者模式和监听者模式 监听者模式: 当有一个事件发生时,通知关注此事件的对象,告诉事件发生了就发布这个事件,那怎么知道通知谁呢,所以需要知道谁关心这个事件,那么就需要对这个事件关心的对象中定义一个事件,如果事件发生了,关心的这个对象就监听到了,可以执行相应的操作。 观察者模式: 一对多的模式,一个被观察者Observable和多个观察者Observer,被观察者中存储了所有的观察者对象,当被观察者接收到一个外界的消息,就会遍历广播推算消息给所有的观察者 例如日常生活中的订阅报纸,报纸老板A,现在小明和老板打招呼说我要订报纸(这个过程就相当于观察者的注册),老板A就会拿出自己的小本本记下小明,下次小王、小芳也是类似的操作,现在老板A就有了三个观察者了,然后老板会自动的把报纸送到三位的家里,突然有一天小明说不想订报纸了,老板就在自己的小本本上划掉小明的名字(观察者的取消注册),等到送报纸的时候就不再送到小明家里。 2