首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java线程(篇外篇):阻塞队列BlockingQueue

言归正传,这一段时间我的工作主要是改进公司的调度器,调度器调度线程池执行任务,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入任务,消费者从队列里提取任务执行,调度器里是通过...链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。         3. ...SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。        ...10个取鸡蛋线程,前5个放入鸡蛋的线程成功执行,到第6个,发现盘子满了,阻塞住,这时切换到取鸡蛋线程执行,成功实现了生产者/消费者模式。...java.util.concurrent包是个强大的包!

77800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JAVA线程池学习以及队列拒绝策略

    为什么要用线程池? 在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。...另外,通过适当的调整线程池中的线程数据可以防止出现资源不足的情况。 ThreadPoolExecutor类 JDK 1.5以后,Java提供一个线程池ThreadPoolExecutor类。...workQueue:当核心线程不能都在处理任务时,新进任务被放在Queue里。 线程池中任务有三种排队策略: 直接提交。直接提交策略表示线程池不对任务进行缓存。...e.isShutdown()) {e.getQueue().poll();e.execute(r); }} 该策略就稍微复杂一些,在pool没有关闭的前提下首先丢掉缓存队列中的最早的任务,然后重新尝试运行该任务...(我用的就是这个,同上所述,相当于创建了相同corePoolSize、maximumPoolSize的线程池) 3. newCachedThreadPool:创建一个可缓存线程池。

    1.1K21

    java面试知识要点汇总(缓存和消息队列)

    网上的常规与经典面试题汇总与答案—–缓存和消息队列 面试常考知识点 缓存 redis有哪些类型 String(Key-Value) String是最常用的一种数据类型,普通的key/value存储都可以归为此类...我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列(栈就是insertFirst+deleteFirst,队列就是insertLast+deleteFirst...队列 位操作(大数据处理) 分布式锁与单线程机制 最新列表 排行榜 Redis 持久化机制 RDB持久化 RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。...既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了 单线程只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的...foxhandler=RssReadRenderProcessHandler 消息队列 消息队列的使用场景 异步处理 应用解耦 流量削锋 日志处理 https://blog.csdn.net/seven

    69810

    Java线程 (Part3: 线程、进程原理、阻塞队列)

    Java 线程池原理线程复用通过 Override Thread类中的start方法,不断循环调用传递过来的Runnable对象线程池的组成线程池主要由4部分组成:线程池管理器: 创建和管理线程池工作线程...: 线程池中的线程任务接口: 每个任务必须实现的接口,用于工作线程调度其运行任务队列: 存放待处理的任务,一种缓存机制 线程池 使用 Executor,Executors,ExecutorService...丢弃即将被执行的任务,并尝试重新提交当前任务DiscardPolicy 丢弃无法处理的任务 不予处理Java 线程池工作过程线程池创建,无线程,任务队列通过参数传入调用 execute() 添加任务;...线程完成当前任务,从队列中拿取下一个任务执行当线程不执行任务且超过keepAliveTime,当线程数大于corePoolSize,线程会被停掉,当所有任务完成,收缩到corePoolSize大小Java...: 支持优先级排序的无界阻塞队列 (compareTo 排序实现优先)DelayQueue: 使用优先级队列的无界阻塞队列缓存失效,定时任务)SynchronousQueue: 不存储元素的阻塞队列

    20010

    JAVA线程-CPU缓存和内存屏障(四)

    上节说了线程中止,优雅和暴力的方式,也说到了通过标志位的方式,这次一起说说CPU缓存和内存屏障。 ?...具有较大L3缓存的处理器更有效的文件系统缓存行为及较短消息和处理器队列长度. 一般是多核共享一个L3缓存。不管你电脑有多少个CPU,每个CPU都有L1 和 L2,但是L3都是共用的。...分析:关键词是单线程情况下,必须遵守;其余的不遵守。 ⑤ CPU高速缓存和CPU执行指令重排序的问题 1.缓存中的数据与主内存的数据并不是实时同步的, 各CPU间缓存的数据也不是实时同步....多核多线程中, 指令逻辑无法分辨因果关联, 可能出现乱序执行, 导致程序运行结果错误。...⑥ 解决CPU告诉缓存和CPU质量重排序的问题 1.写内存屏障(Store Memory Barrier): 在指令后插入Store Barrier, 能让写入缓存中的最新数据更新写入主内存, 让其他线程可见强制写入主内存

    1.8K10

    Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )

    , 会将需要操作的数据加入到 CPU 缓存 中 ; CPU 缓存分为 L1 , L2 , L3 , 3 个级别的缓存 , 如下图所示 ; CPU 执行线程时 , 不直接操作内存中的数据 , 而是通过...CPU 缓存进行处理 ; JMM ( Java Memory Model - Java 内存模型 ) 参考了 CPU 缓存模型 , CPU 都是多核的 , 每个核中都有 L1 和 L2 缓存 , L3...缓存整个 CPU 的所有核心共同使用 ; Java 内存模型只是一种规范 ; Java 虚拟机运行时内存 , 是不同的虚拟机实现的不同的内存使用方式 ; 每种虚拟机的底层实现都是不同的 ; Java...线程 运行时 , 每个 Java 线程都配套一个 工作内存 , 然后工作内存从 主内存 中获取数据 , 主内存被所有工作内存共享 ; 工作内存 就是 线程的 本地内存 , 其中存储的是主内存中的 变量副本...L2 缓存 , 主内存 相当于 CPU 中的 L3 缓存 ; 如果多个线程同时对 主内存 中的同一个变量进行修改 , 变量的值被不同线程按照不同顺序进行改变 , 主线程中的这个变量是 线程不安全的 ;

    57130

    Java线程高并发学习笔记——阻塞队列

    阻塞队列,关键字是阻塞,先理解阻塞的含义,在阻塞队列中,线程阻塞有这样的两种情况: 1.当阻塞队列为空时,获取队列元素的线程将等待,直到该则塞队列非空;2.当阻塞队列变满时,使用该阻塞队列线程会等待,...为什么要使用阻塞队列? 在常见的情况下,生产者消费者模式需要用到队列,生产者线程生产数据,放进队列,然后消费从队列中获取数据,这个在单线程的情况下没有问题。...这些情况都要程序员自己控制阻塞,同时又要线程安全和运行效率。 阻塞队列的出现使得程序员不需要关心这些细节,比如什么时候阻塞线程,什么时候唤醒线程,这些都由阻塞队列完成了。...写到代码里就是洗碗工就是一个生产者线程,厨师就是消费者线程,工作台就是阻塞队列。...反之亦然,当消费者线程多于生产者线程时,消费者速度大于生产者速度,当队列为空时,就会阻塞消费者线程,直到队列非空。

    45110

    Java线程高并发学习笔记——阻塞队列

    阻塞队列,关键字是阻塞,先理解阻塞的含义,在阻塞队列中,线程阻塞有这样的两种情况: 1.当阻塞队列为空时,获取队列元素的线程将等待,直到该则塞队列非空;2.当阻塞队列变满时,使用该阻塞队列线程会等待,...为什么要使用阻塞队列? 在常见的情况下,生产者消费者模式需要用到队列,生产者线程生产数据,放进队列,然后消费从队列中获取数据,这个在单线程的情况下没有问题。...这些情况都要程序员自己控制阻塞,同时又要线程安全和运行效率。 阻塞队列的出现使得程序员不需要关心这些细节,比如什么时候阻塞线程,什么时候唤醒线程,这些都由阻塞队列完成了。...写到代码里就是洗碗工就是一个生产者线程,厨师就是消费者线程,工作台就是阻塞队列。...反之亦然,当消费者线程多于生产者线程时,消费者速度大于生产者速度,当队列为空时,就会阻塞消费者线程,直到队列非空。

    1.2K80

    如何解决Java线程队列过饱问题

    的Executors框架提供的定长线程池内部默认使用LinkedBlockingQueue作为任务的容器,这个队列是没有限定大小的,可以无限向里面submit任务。...当线程池处理的太慢的时候,队列里的内容会积累,积累到一定程度就会内存溢出。...即使没有内存溢出,队列的延迟势必会变大,而且如果进程突然遇到退出信号,队列里的消息还没有被处理就被丢弃了,那必然会对系统的消息可靠性造成重大影响。 那如何解决线程池的过饱问题呢?...从队列入手,无外乎两种方法 增加消费者,增加消费者处理效率 限制生产者生产速度 增加消费者就是增加线程池大小,增加消费者处理效率就是优化逻辑处理。...,当队列元素达到上线的时候,生产者线程会阻塞住,直到队列被消费者消费到有空槽的时候才会继续下去。

    1.4K10

    Java阻塞队列线程集控制的实现方法

    Java阻塞队列线程集控制的实现方法 队列以一种先进先出的方式管理数据。如果你试图向一个已经满了的阻塞队列中添加一个元素,或是从一个空的阻塞队列中移除一个元素,将导致线程阻塞。...在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可以定期的把中间结果存到阻塞队列中。而其他工作者线程把中间结果取出并在将来修改它们。队列会自动平衡负载。...如果第一个线程集运行的比第二个慢,则第二个线程集在等待结果时就会阻塞。如果第一个线程集运行的快,那么它将等待第二个线程集赶上来。 下面的程序展示了如何使用阻塞队列来控制线程集。...java.util.concurrent包提供了阻塞队列的4个变种:LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue...这个操作很快,如果队列没有设上限的话,很快它就包含了没有找到的文件。 我们同时还启动了大量的搜索线程。每个搜索线程队列中取出一个文件,打开它,打印出包含关键字的所有行,然后取出下一个文件。

    98680

    条件队列是个线程队列

    关于条件队列,你能说些什么? 条件队列是一个容器,它承载着一组等待“先验条件”成真的线程。 先验条件这个词文绉绉的,用白话讲就是你做一件事的前提条件。...回到上面blockingQueue的例子,我们先拿到这个队列的锁、再检查队列是否已满。如果队列已满,我们就不能继续执行put,需要block住,然后等候队列不满的通知。如何实现呢?...当你调用wait的时候,这个线程就进到了条件队列。而当有其它线程notify的时候,实际上就是通知条件队列里的线程(先验)条件发生了变化,让这些线程有机会重新去检查这些条件并继续运行。...就内置条件队列来说,比较不好的一面是:调用wait()把线程放入这个内部条件队列意味着因为等待不同“先验条件”的线程都在同一队列中,就是说不同的先验条件共享同一个内部条件队列。...而Condition接口,可以帮助我们针对不同的先验条件创建不同的条件队列,这样就可以只唤醒与之对应的线程了。从锁与条件队列的关系你应该可以猜到,Lock接口提供了创建条件队列的方法。

    26530

    使用队列实现缓存淘汰

    数据结构设计 在上文中实现了一个简单的缓存,并定时对缓存做过期处理。...在这一篇文章中将通过基于队列的思想实现对缓存的限制 在写代码之前,首先要想好数据怎么存储也就是存储结构,理清了这一步,代码就好写了。...可以简单的理解为,使用队列做了一层存储的check 队列数据结构 首先需要实现一个队列的存储结构,队列是一种线性的数据结构,我们可以使用数组或是链表来实现,因为我们需要的是一个定长的队列,而且时间复杂度要求低些...数据结构如下: type Queue struct { cap int //队列的容量 head int // 队列头游标 tail int // 队列尾游标...当队列满时,再添加数据,做pop出队操作,并删除map中的key,通过队列实现了对map长度的限制。

    1.1K40

    Redis队列缓存应用示例

    消息队列的一个典型应用就是通过异步处理方式,来解决某些场景下的高并发问题 例如日志的收集,特点是数据量大,并发压力大,不宜直接插入数据库,但实时性要求不高,所以适合使用消息队列缓存日志信息,然后批量进行处理...基本思路 (1)日志信息插入队列缓存 (2)定时读取缓存 批量入库 实现 下面是简单的伪代码示例 (1)日志入队 并发量很高,处理过程应尽量简洁 可以做成接口,供日志记录程序调用 /.../取得日志信息 var info = getinfo(); //添加时间戳 info += "|" + time(); //放入队列 redis.lpush("log", info); (2)入库处理...每分钟从队列中获取N条信息,批量插入数据库 插入过程如果出现错误,需要把失败的信息再次入队,以便下次重新入库 //目标读取信息数量 var count = N; //回滚信息数组 var arr_rollback...= array(); //获取消息队列的内容,拼接sql /** 批量insert的格式为: INSERT INTO users(name, age) VALUES ('姚明', 25), ('盖茨

    1.1K70

    线程编程学习六(Java 中的阻塞队列).

    介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,队列会阻塞获得元素的线程,直到队列变非空。...阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 当线程 插入/获取 动作由于队列 满/空 阻塞后,队列也提供了一些机制去处理,或抛出异常,或返回特殊值,或者线程一直等待......Java 中的阻塞队列: ArrayBlockingQueue ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。...,生产线程可以一直生产;只要队列不空,消费线程可以一直消费,不会相互因为独占锁而阻塞。...应用场景: 缓存系统的设计:可以用 DelayQueue 保存缓存元素的有效期,使用一个线程循环查询 DelayQueue,一旦能从 DelayQueue 中获取元素时,表示缓存有效期到了。

    51820

    37.python 线程队列PriorityQueue(优先队列

    线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列中的数据按照优先级排序...一.队列Queue分类: 1.线程队列Queue — FIFO(先进先出队列),即哪个数据先存入,取数据的时候先取哪个数据,同生活中的排队买东西; 2.线程队列LifoQueue — LIFO(先进后出队列...线程队列Queue 有了详细讲解,两者都属于Queue,函数都一样!...猜你喜欢: 1.python线程队列Queue-FIFO 2.python线程队列LifoQueue 3.python线程互斥锁Lock 4.python线程时间Event 转载请注明:猿说Python...» python线程队列PriorityQueue(优先队列

    2.8K20

    java 优先级队列_JAVA 队列

    优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用。优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据。...PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。...优先队列要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。 优先队列的头是基于自然排序或者Comparator排序的最小元素。...当我们获取队列时,返回队列的头对象。 优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。...PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java线程环境。

    53010

    最全java线程总结3——了解阻塞队列线程安全集合不

    看了前两篇你肯定已经理解了 java 并发编程的低层构建。...阻塞队列   对于许多线程问题,都可以使用一个或多个队列来安全、优雅的进行数据的传递。...无需使用锁和条件对象,java 自带的阻塞队列就能够完美的解决这个问题。阻塞队列中所有方法都是线程安全的,所以我们进行读取、写入操作时无需考虑并发问题。...阻塞队列的实现   在 java.util.concurrent 包中,提供了阻塞队列的几种实现,当前也可以自己实现 BlockingQueue 接口,实现自己的阻塞队列。...本节介绍 Java 类库中提供的线程安全的集合(上一节介绍的阻塞队列也在其中)。   这类集合,size 是通过便利得出的,较慢。

    1.1K30
    领券