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

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

Java阻塞队列线程控制的实现方法 队列以一种先进先出的方式管理数据。如果你试图向一个已经满了的阻塞队列中添加一个元素,或是从一个空的阻塞队列中移除一个元素,将导致线程阻塞。...在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可以定期的把中间结果存到阻塞队列中。而其他工作者线程把中间结果取出并在将来修改它们。队列会自动平衡负载。...如果第一个线程集运行的比第二个慢,则第二个线程在等待结果时就会阻塞。如果第一个线程集运行的快,那么它将等待第二个线程赶上来。 下面的程序展示了如何使用阻塞队列来控制线程。...如果公平参数被设置了,等待时间最长的线程会优先得到处理。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。 生产者线程枚举在所有子目录下的所有文件并把它们放到一个阻塞队列中。...这个操作很快,如果队列没有设上限的话,很快它就包含了没有找到的文件。 我们同时还启动了大量的搜索线程。每个搜索线程队列中取出一个文件,打开它,打印出包含关键字的所有行,然后取出下一个文件。

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

    Android多线程编程__阻塞队列

    阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。...常见阻塞场景 当队列中没有数据的情况下,消费者端的所有线程都会被自动堵塞(挂起),直到有数据放入队列。...当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。 支持以上两种阻塞场景的被称为阻塞队列。...公平访问队列就是指阻塞的所有生产者线程或消费线程,当队列可用是,可以按照阻塞的先后顺序访问队列。即先阻塞的生产者线程,可以先往队列里插入元素;先阻塞的消费者线程,可以先从队列里获取元素 。...才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒。

    1K30

    阻塞队列中的线程协作(阻塞、唤醒、锁)

    自己写一个阻塞队列 阻塞队列,主要操作有两个,一个是put放入元素,另一个是take取出元素。所谓的阻塞就是当多个线程同时存取数据时,如果遇到队列为空或者队列为满时,会发生阻塞。...如果正常存入了元素,那么唤醒其他阻塞线程(有些执行take操作的线程因为队列为空而阻塞) take: 从队列中取一个元素,如果队列为空,则阻塞当前线程,等待唤醒。...如果正常取出了元素,那么唤醒其他阻塞线程(有些执行put操作的线程因为队列满而阻塞) Object类提供了几个操作来进行当前线程的唤醒和阻塞。...wait: 阻塞当前线程,其实就是将当前线程放入当前对象的等待集中,释放锁(如果持有锁的话),暂停当前线程。 notify: 唤醒当前对象等待上的一个线程。...notifyAll: 唤醒当前对象等待上的所有线程

    1.2K30

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

    言归正传,这一段时间我的工作主要是改进公司的调度器,调度器调度线程池执行任务,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入任务,消费者从队列里提取任务执行,调度器里是通过...ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象必须明确大小,像数组一样。        2....LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小,默认值是Integer.MAX_VALUE。...SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。        ...10个取鸡蛋线程,前5个放入鸡蛋的线程成功执行,到第6个,发现盘子满了,阻塞住,这时切换到取鸡蛋线程执行,成功实现了生产者/消费者模式。

    79100

    线程应用 - 阻塞队列ArrayBlockingQueue详解

    boolean fair为true时采用公平锁,线程获取锁的顺序会和线程调用lock获取锁的顺序一样,但是公平锁需要增加阻塞和唤醒的时间开销。...添加操作完成后,还会唤醒因元素为空无法获取元素而阻塞住的线程。另外放入元素后队列容量达到最大值时,会重置putIndex的位置为0。...= null) itrs.elementDequeued(); //唤醒因队列满了导致无法读取元素而阻塞线程 notFull.signal(); //返回当前元素...= null) itrs.removedAt(removeIndex); } //唤醒因队列空间满而无法放入元素导致阻塞线程 notFull.signal...notFull.signal()可以唤醒因队列空间满而无法将元素放入数组导致阻塞线程,notEmpty()可以唤醒因队列空间无数据而无法取出数组中的元素导致阻塞线程

    1.5K10

    线程应用 - 阻塞队列LinkedBlockingDeque详解

    一、LinkedBlockingDeque简介 在多线程阻塞队列的应用中上一篇已经讲述了ArrayBlockingQueue,在这一篇主要介绍思想与他差不多的另一个阻塞队列,基于链表的阻塞队列-...基于链表的阻塞队列和基于数组的阻塞队列相同,内部都有一把可重入锁,对于该队列的写操作和读操作都会进行加锁,所以他们都是线程安全的,但是写操作和读操作都会占用锁资源所以在并发量大的情况下会降低性能。...else //原来的头结点的上一个结点为当前新插入的结点 f.prev = node; //当前容量增加 ++count; //唤醒读取时因队列中无元素而导致阻塞线程...else //将原尾结点的下一个结点指向新插入的节点 l.next = node; //当前容量增加 ++count; //唤醒读取时因队列中无元素而导致阻塞线程...将新的尾结点的下一个结点指向null,因为他已经为尾结点所以不需要指向下一个结点 p.next = null; //数量减少 --count; //唤醒因添加元素时队列容量满导致阻塞线程

    2.4K30

    线程应用 - 阻塞队列LinkedBlockingQueue详解

    0,这一步的写操作需要唤醒读操作 signalNotEmpty(); return true; } //这个方法与put方法相比,不会阻塞线程队列满则直接返回。...putLock.unlock(); } if (c == 0) signalNotEmpty(); return c >= 0; } 写操作时会获取写锁,第一个方法当队列满了导致无法写入时会阻塞线程...第二个方法指定了阻塞超时时间,超过了阻塞超时时间或被唤醒则停止阻塞,继续执行。第三个方法不会阻塞,当读取失败则直接返回。 可以对比看出,读线程的锁操作与写线程的锁操作类似。...他也是线程安全的阻塞队列阻塞条件为读操作时如果队列为空则阻塞、写操作时如果队列满则阻塞。...他们在读操作遇到队列为空或者写操作队列为满时都会阻塞线程。 (3)构造函数不同,LinkedBlockingQueue可以指定最大容量的小或者不指定,不指定时他的容量大小为最大值。

    1.3K20

    阻塞队列与非阻塞队列

    使用线程安全队列的场景有很多,Java在实现同步机制时,多线程对竞争资源进行操作时,同一时刻只能有一个线程可以操作,其他线程进行阻塞等待,这时,需要使用一种容器队列来装载等待的线程,在入队和出队时候保证线程的安全性...,当有入队时则会唤醒阻塞的出队操作线程;当队列满时,进行入队操作的线程将被阻塞,当有出队时则会唤醒阻塞的入队操作线程。...;出队不仅需要唤醒满队列时入队阻塞线程,还需要唤醒空队列出队的线程。...阻塞队列是一种线程安全的队列,支持在并发环境下对队列的入队和出队操作,适用于生产者与消费者模式,入队线程就是生产者,出队线程就是消费者。...当队列为空(或队列为满)时,消费者(或生产者)线程会进入阻塞状态,使用线程阻塞/通知模型,来通知阻塞线程

    3.1K30

    源码剖析ThreadPoolExecutor线程池及阻塞队列

    ,今天我们主要探讨这个 7 * 第三步:阻塞队列被塞满了,需要创建新的非核心线程数量worker线程去处理我们的任务,创建worker线程失败了会触发拒绝策略,默认抛异常 8...true,那么此时也仅仅启动了核心线程,那么超过核心线程数的就应该加入到队列中,那么有什么队列供我们选择呢?  ...ArrayBlockingQueue讲解完了,再来看看LinkedBlockingQueue:三个方法对于任务的存放与取出与ArrayBlockingQueue并无太大差别,我们就不做太多的讲解,简单说一下,主要的就是节点阻塞队列与数组阻塞队列所用到的锁机制不一样...,如果是则返回false,线程池则会创建新的worker线程,不是空队列则会唤醒进行获取任务的worker线程并返回数据//3、如果是拿数据,判断是否是空队列,则新创建节点并阻塞当前线程等待放数据时唤醒...worker线程运行任务,如果有等待节点,那么存入当前任务数据,并且再移除存入的数据节点和等待的节点,等待的节点此时会被赋值存入的任务并被唤醒//第三步:如果是取出数据,空节点时存入等待数据节点并阻塞当前线程

    18231

    【多线程】等待唤醒机制和阻塞队列

    阻塞队列 2.1....阻塞队列的使用 阻塞队列是一种特殊的队列,相比于普通的队列,它支持两个额外的操作:当队列为空时,获取元素的操作会被阻塞,直到队列中有元素可用;当队列已满时,插入元素的操作会被阻塞,直到队列中有空间可以插入新元素...当阻塞队列满的时候,线程就会进入阻塞状态: public class ThreadDemo19 { public static void main(String[] args) throws InterruptedException...实现阻塞队列 根据阻塞队列的特性,可以尝试来自己手动实现一下 可以采用数组来模拟实现: public class MyBlockingDeque { private String[] data...线程一瞬间就把阻塞队列沾满了,后面还是一个线程生产,一个线程消费,虽然打印出来的有偏差 生产者和消费者之间通过缓冲区进行通信,彼此之间不需要直接交互。

    8410

    ThreadPoolExecutor 线程池配置 和 阻塞队列BlockingQueue

    [JDK] ThreadPoolExecutor 线程池配置 和 阻塞队列BlockingQueue 创建和配置 ExecutorService 执行器服务,它使用可能的几个池线程之一执行每个提交的任务...如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。...BlockingQueue是一个阻塞线程安全的一个队列   多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。...(本方法不阻塞当前执行方法的线程) offer(E o, long timeout, TimeUnit unit),可以设定等待的时间,如果在指定的时间内,还不能往队列中加入BlockingQueue,...,并缓存在队列内部,而生产者立 即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列,直到消费者从 队列中消费掉一份数据,生产者线程会被唤醒

    2.1K20

    线程案例(2)——阻塞队列

    生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力...这个阻塞队列就是用来给生产者和消费者解耦的。...阻塞队列是并发编程中的一个重要基础组件,帮助我们实现“生产者-消费者模型”(是一种典型的处理并发编程的模型) 如果入队列太快了,继续入队列就会阻塞,一直阻塞到有其他线程去消费队列了,才能继续入队列;如果出队列操作太快了...,队列空了,也会阻塞,一直阻塞到没有其他线程生产了元素,才能继续出队列 阻塞队列也符合先进先出的规则 阻塞队列实现 //阻塞队列 public class ThreadDemo21 { static...(入队列/出队列)(没有去队首元素操作) //1.阻塞版本的入队列 public void put(int value) throws InterruptedException

    25630

    阻塞队列

    如果我们把多线程环境比作是分布式的话,那么线程与线 程之间是不是也可以使用这种消息队列的方式进行数据通 信和解耦呢?...另外,阻塞队列是一个 fifo 的队列,所以对于希望在线程 级别需要实现对目标服务的顺序访问的场景中,也可以使用。...J.U.C 中的阻塞队列   J.U.C 提供的阻塞队列 在 Java8 中,提供了 7 个阻塞队列: ArrayBlockingQueue   数组实现的有界阻塞队列, 此队列按照先进先出(FIFO...offer(e) : 添加元素到队列,同时会返回元素是否插入 成功的状态,如果成功则返回 true put(e) :当阻塞队列满了以后,生产者继续通过 put 添加元素,队列会一直阻塞生产者线程,知道队列可用...offer(e,time,unit) :当阻塞队列满了以后继续添加元素, 生产者线程会被阻塞指定时间,如果超时,则线程直接 退出 2.

    65610

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

    阻塞队列原理线程阻塞的两种情况队列没有数据,Cusomer端所有线程被自动阻塞,直到有数据放入队列队列塞满数据,Producer端所有线程被自动阻塞,知道队列中有空的位置阻塞队列的主要方法插入 --...)阻塞 -- pool(time,unit)超时检查 -- element()抛出异常 -- peek()特殊值 -- 不可用 -- 不可用Java中的阻塞队列ArrayBlockingQueue: 由数组组成的有界阻塞队列...(公平,非公平)LinkedBlockingQueue: 由链表组成的有界阻塞队列 (两个独立锁提高并发)PriorityBlockingQueue: 支持优先级排序的无界阻塞队列 (compareTo...排序实现优先)DelayQueue: 使用优先级队列的无界阻塞队列 (缓存失效,定时任务)SynchronousQueue: 不存储元素的阻塞队列 (不存储数据,可用于传递数据)LinkedTransferQueue...: 由链表组成的无界阻塞队列LinkedBlockingDeque: 由链表组成的双向阻塞队列CyclicBarrier、CountDownLatch、Semaphore 用法CountDownLatch

    20810

    使用阻塞队列实现线程同步_线程可以并行执行吗

    ,如果系统只有一个 CPU,则它根本不可能真正同时进行一个以上的线程,它只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发...同步:你去书店买本书,老板说帮你找一下,然后开始找,等到找到了再告诉你结果为止(返回结果) 异步:你去书店买本书,老板说帮你找一下找到再给你打电话(不返回结果),等他找到的就打电话给你(回调) 四、阻塞和非阻塞...1.名词解释 阻塞:是指调用结果返回之前,当前线程会被挂起。...调用线程只有在得到结果之后才会返回 非阻塞:调用指在不能立刻得到结果之前,该调用不会阻塞当前线程 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态 2.举个例子 阻塞:你去书店买书,立即买到了...,或者没有立刻就走了,这就是非阻塞阻塞:你去书店买书,如果恰好书店没有,你就等一直等到书店有了这本书买到了才走,然后后排的人必须等你走了以后才能买书 发布者:全栈程序员栈长,转载请注明出处:https

    49930

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

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

    45610

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

    简介 说明 本文用示例介绍Java中阻塞队列(BlockingQueue)的用法。...若超出corePoolSize个任务,直接创建新线程来执行任务,直到(corePoolSize+新建线程)> maximumPoolSize。 此策略可以避免在处理可能具有内部依赖性的请求时出现锁。...每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态 详见下边的:CachedThreadPool的execute流程 PriorityBlockingQueue 基于链表的优先级队列...如果队列己满:阻塞当前线程,直到队列有空闲插入成功后返回。 如果在阻塞时被其他线程设置了中断标志:被阻塞线程会抛出InterruptedException异常而返回。...如果队列为空则阻塞当前线程直到队列不为空然后返回元素; 如果在阻塞时被其他线程设置了中断标志,则被阻塞线程会抛出InterruptedException异常而返回。

    48330

    线程编程:阻塞、并发队列的使用总结

    老习惯,还是先跟各位纸上谈会儿兵,首先说说队列,他主要分为并发队列阻塞队列,在多线程业务场景中使用最为普遍,我就主要结合我所做过的业务谈谈我对它们的看法,关于它们的API和官方解释就不提了。...并发队列 并发队列:最常见的业务场景就是多个线程共享同一个队列中的所有资源,就拿我们公司的业务场景来说,当用户通过多个渠道下单后,然后就会有多个不同的客户端通道同时去获取订单并处理订单,为了加快订单处理速度我们使用并发队列来充当任务源头...剩余:" + queueYQ.size() + "个任务"); 55 } 56 } 57 } 58 } 阻塞队列 阻塞队列:最常见的业务场景就是生产者不断生产任务放进阻塞队列中...,消费者不断从阻塞队列中获取任务;当阻塞队列中填满数据时,所有生产者端的线程自动阻塞,当阻塞队列中数据为空时,所有消费端的线程自动阻塞。...阻塞队列的一些常用方法 ?

    1.8K50

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

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

    1.2K80
    领券