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

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

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

75400

Java线程池ExecutorService中重要的方法

Java线程池ExecutorService中重要的方法 ExecutorService 是 java 线程池定义的一个接口,它在 java.util.concurrent 包中,在这个接口中定义了和后台任务执行相关的方法...Java线程池ExecutorService中重要的方法 Java API对 ExecutorService 接口实现有两个,所以这两个即是线程池的具体实现。 1\....image.png 实线表示继承,需要表示实现 ExecutorService 的创建 Java 提供了一个工厂类 Executors 来创建各种线程池。...newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,如果没有可以回收的,则新建线程。...newFixedThreadPool 创建一个定长的线程池,可控制线程最大并发数,超出的线程会在队列中等待。

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

Java线程 | 并发知识问答总结(重要!)

那么Java是如何对线程进行调用的呢?...JVM 在 HotSpot 这种实现下,Java 线程是会一对一映射到内核线程上的,也就是说 Java线程的创建和回收,因为需要内核操作,所以需要依赖于真实的操作系统帮忙。...maximumPoolSize:最大线程数 当线程数 >= corePoolSize,且任务队列已满时,线程池会创建新线程来处理任务 当线程数 = maxPoolSize,且任务队列已满时,线程池会跟根据拒绝策略进行相应的处理...若没有,这个新任务就会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。 缺点:不支持自定义拒绝策略,固定线程数量带来的局限,有时候并不是一件好事。...特点:单线程线程池,若多余任务被提交到该线程池,任务会先被保存在一个任务队列中,直到线程空闲,按先入先出的顺序执行队列中的任务。

50830

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

为什么要用线程池? 在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。...另外,通过适当的调整线程池中的线程数据可以防止出现资源不足的情况。 ThreadPoolExecutor类 JDK 1.5以后,Java提供一个线程池ThreadPoolExecutor类。...如果正在运行的线程等于corePoolSize时,ThreadPoolExecutor优先往队列中添加任务,直到队列满了,并且没有空闲线程时才创建新的线程。...此时主线程接着往线程池中塞任务,线程池已达到最大线程数(3),于是开始往队列里放。当某个线程执行完任务后,直接从队列里拉出新的任务执行,队列具有先进先出的特性,因此后面的任务执行是有序的。...线程池创建了2个线程,分别执行任务0、1,线程池达到corePoolSize,新进任务2、3被放入队列中等待处理,此时队列满,而线程池中线程没有执行完任务0、1,线程池创建新的线程,执行新进任务4、5,

1.1K21

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

Java 线程池原理线程复用通过 Override Thread类中的start方法,不断循环调用传递过来的Runnable对象线程池的组成线程池主要由4部分组成:线程池管理器: 创建和管理线程池工作线程...丢弃即将被执行的任务,并尝试重新提交当前任务DiscardPolicy 丢弃无法处理的任务 不予处理Java 线程池工作过程线程池创建,无线程,任务队列通过参数传入调用 execute() 添加任务;...线程完成当前任务,从队列中拿取下一个任务执行当线程不执行任务且超过keepAliveTime,当线程数大于corePoolSize,线程会被停掉,当所有任务完成,收缩到corePoolSize大小Java...阻塞队列原理线程阻塞的两种情况队列没有数据,Cusomer端所有线程被自动阻塞,直到有数据放入队列队列塞满数据,Producer端所有线程被自动阻塞,知道队列中有空的位置阻塞队列的主要方法插入 --...thread阻塞会导致整个process堵塞Java 线程调度 (抢占式调度)JVM线程采用抢占式调度;优先级越高越先执行;优先级高不代表可以独自占用CPU时间片线程让出CPU情况线程主动放弃CPU线程因为某些原因被阻塞线程运行结束进程调度算法优先调度算法

18210

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

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

43210

Java线程系列--阻塞队列BlockingQueue的用法

简介 说明 本文用示例介绍Java中阻塞队列(BlockingQueue)的用法。...如果队列己满:阻塞当前线程,直到队列有空闲插入成功后返回。 如果在阻塞时被其他线程设置了中断标志:被阻塞线程会抛出InterruptedException异常而返回。...如果队列为空则阻塞当前线程直到队列不为空然后返回元素; 如果在阻塞时被其他线程设置了中断标志,则被阻塞线程会抛出InterruptedException异常而返回。...同样执行6个任务 核心线程执行任务1和2,其它的任务3~6放到队列中 执行完1和2,将3和4从队列中取出执行 执行完3和4,将5和6从队列中取出 创建线程池代码如下: /** * LinkedBlockingQueue...该队列也不允许放入null值,它使用与类java.util.PriorityQueue 相同的排序规则,也不允许放入不可比较的对象,这样做会导致ClassCastException。

33030

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

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

95280

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

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

1.2K80

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

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

1.4K10

条件队列是个线程队列

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

24730

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

介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,队列会阻塞获得元素的线程,直到队列变非空。...阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 当线程 插入/获取 动作由于队列 满/空 阻塞后,队列也提供了一些机制去处理,或抛出异常,或返回特殊值,或者线程一直等待......Java 中的阻塞队列: ArrayBlockingQueue ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。...此队列按照先进先出(FIFO)的原则对元素进行排序,默认情况下不保证线程公平的访问。 通过可重入的独占锁 ReentrantLock 来控制并发,Condition 来实现阻塞。...,生产线程可以一直生产;只要队列不空,消费线程可以一直消费,不会相互因为独占锁而阻塞。

49420

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.7K20

java 优先级队列_JAVA 队列

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

49710

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

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

1.1K30

Java并发编程:4种线程池和缓冲队列BlockingQueue

线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池。...四种常见的线程池详解 1. 线程池的返回值ExecutorService简介: ExecutorService是Java提供的用于管理线程池的类。...,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程 2.2 Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程...缓冲队列BlockingQueue和自定义线程池ThreadPoolExecutor 1. 缓冲队列BlockingQueue简介: BlockingQueue是双缓冲队列。...BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。 2.

76110

Java并发编程:4种线程池和缓冲队列BlockingQueue

线程池简介 1. 线程池的概念:           线程池就是首先创建一些线程,它们的集合称为线程池。...四种常见的线程池详解 1. 线程池的返回值ExecutorService简介:          ExecutorService是Java提供的用于管理线程池的类。...,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程 2.2  Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程...缓冲队列BlockingQueue和自定义线程池ThreadPoolExecutor 1. 缓冲队列BlockingQueue简介:           BlockingQueue是双缓冲队列。...BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。 2.

99900

队列、进程互斥锁、线程

如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,在返回和使用结果之间,队列中可能已经加入新的项目。 q.full() :如果q已满,返回为True....由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。 其他方法(了解) q.close() :关闭队列,防止队列中加入更多数据。...调用此方法时,后台线程将继续写入那些已入队列但尚未写入的数据,但将在此方法完成时马上关闭。如果q被垃圾收集,将自动调用此方法。关闭队列不会在队列使用者中生成任何类型的数据结束信号或异常。...q.join_thread() :连接队列的后台线程。此方法用于在调用q.close()方法后,等待所有队列项被消耗。默认情况下,此方法由不是q的原始创建者的所有进程调用。...用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

1.9K20

线程池和队列学习,队列线程池中的使用,什么是队列阻塞,什么是有界队列「建议收藏」

1,按阻塞队列和非阻塞队列划分为两类 1、没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口   内置的不阻塞队列...加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。   ...理解阻塞两个字对下面线程池中理解核心线程数和最大线程数的关系很重要。 五个队列所提供的各有不同:   * ArrayBlockingQueue :一个由数组支持的有界队列。   ...这里加入一个队列结合线程池使用的案例: package com.yao; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue...; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class BlockingQueueTest

1.8K30
领券