精华内容
下载资源
问答
  • 展开全部阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作62616964757a686964616fe59b9ee7ad9431333337393566将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞...

    展开全部

    阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作62616964757a686964616fe59b9ee7ad9431333337393566将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.

    从5.0开始,JDK在java.util.concurrent包里提供了阻塞队列的官方实现。尽管JDK中已经包含了阻塞队列的官方实现,但是熟悉其背后的原理还是很有帮助的。一下是阻塞队列的实现:public class BlockingQueue {

    private List queue = new LinkedList();

    private int  limit = 10;

    public BlockingQueue(int limit){

    this.limit = limit;

    }

    public synchronized void enqueue(Object item)

    throws InterruptedException  {

    while(this.queue.size() == this.limit) {

    wait();

    }

    if(this.queue.size() == 0) {

    notifyAll();

    }

    this.queue.add(item);

    }

    public synchronized Object dequeue()

    throws InterruptedException{

    while(this.queue.size() == 0){

    wait();

    }

    if(this.queue.size() == this.limit){

    notifyAll();

    }

    return this.queue.remove(0);

    }

    }

    展开全文
  • 非阻塞队列有:ArrayDeque、PriorityQueue、ConcurrentLinkedQueue之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进行阻塞,而非阻塞队列则没有这两个方法,同时poll和offer...

    非阻塞队列有:ArrayDeque、PriorityQueue、ConcurrentLinkedQueue

    之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进行阻塞,而非阻塞队列则没有这两个方法,同时poll和offer方法也不提供超时参数设定。

    ArrayDeque非阻塞的数组结构队列,底层数组实现,且双向操作,即可以向头添加数据也可向尾添加数据,既可头部取数据亦可尾部取数据。

    基本上可以分成两类,一类是以add,remove,get开头的方法,这类方法失败后会抛出异常,一类是以offer,poll,peek开头的方法,这类方法失败之后会返回特殊值,如null。大部分方法基本上都是可以根据命名来推断其作用,如addFirst,当然就是从队列头部插入,removeLast,便是从队列尾部移除,get和peek只获取元素而不移除,getFirst方法调用时,如果队列为空,会抛出NoSuchElementException异常,而peekFirst在队列为空时调用则返回null。

    从队列首部插入/取出

    从队列尾部插入/取出

    失败抛出异常

    失败返回特殊值

    失败抛出异常

    失败返回特殊值

    插入

    addFirst(e)    push()

    offerFirst(e)

    addLast(e)

    offerLast(e)

    移除

    removeFirst()  pop()

    pollFirst()

    removeLast()

    pollLast()

    获取

    getFirst()

    peekFirst()

    getLast()

    peekLast()

    常用阻塞队列给出的方法

    方法\处理方式

    抛出异常

    返回特殊值

    一直阻塞

    超时退出

    插入方法

    add(e)

    offer(e)

    put(e)

    offer(e,time,unit)

    移除方法

    remove()

    poll()

    take()

    poll(time,unit)

    检查方法

    element()

    peek()

    不可用

    不可用

    PriorityQueue队列是优先级非阻塞队列,方法都是类似的不多说了。可以参考之前写的阻塞优先级队列。

    https://my.oschina.net/uwith/blog/3057856

    ConcurrentLinkedQueue队列是基于链表的非阻塞队列,感觉没啥区别,只是底层是通过链表来实现的。非阻塞方法和上面的ArrayDeque类似,只是他的只能向队列尾部添加数据,所以没有Last和First方法。总的没啥不一样的地方。用法也比较简单不细记录了。

    简单写下代码测试吧

    package com.example.web.web;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    import java.util.ArrayDeque;

    import java.util.concurrent.ConcurrentLinkedQueue;

    import java.util.concurrent.TimeUnit;

    @RestController

    public class HomeController {

    @RequestMapping("/index")

    public String index() throws Exception {

    ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();

    //生产者

    new Thread(() ->

    {

    try {

    for (int i = 0; i < 5; i++) {

    System.out.println("生产者begin");

    queue.offer("测试数据" + i);

    System.out.println("生产者end");

    }

    } catch (Exception ex) {

    System.out.println(ex);

    }

    }).start();

    //消费者

    new Thread(() ->

    {

    try {

    for (int i = 0; i < 6; i++) {

    System.out.println("==消费者begin");

    TimeUnit.SECONDS.sleep(1);

    String aa = queue.poll();

    System.out.println("==消费者end" + aa);

    }

    } catch (Exception ex) {

    System.out.println(ex);

    }

    }).start();

    //主线程也等待下

    TimeUnit.SECONDS.sleep(15);

    return "网站已得到响应";

    }

    }

    收工........

    参考链接:

    ArrayDeque:https://www.cnblogs.com/mfrank/p/9600137.html

    展开全文
  • 非阻塞队列有:ArrayDeque、PriorityQueue、ConcurrentLinkedQueue之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进行阻塞,而非阻塞队列则没有这两个方法,同时poll和offer...

    非阻塞队列有:ArrayDeque、PriorityQueue、ConcurrentLinkedQueue

    之前都说过阻塞队列了,其实差别都不大,阻塞和非阻塞的区别在于阻塞队列有put和take方法进行阻塞,而非阻塞队列则没有这两个方法,同时poll和offer方法也不提供超时参数设定。

    ArrayDeque非阻塞的数组结构队列,底层数组实现,且双向操作,即可以向头添加数据也可向尾添加数据,既可头部取数据亦可尾部取数据。

    基本上可以分成两类,一类是以add,remove,get开头的方法,这类方法失败后会抛出异常,一类是以offer,poll,peek开头的方法,这类方法失败之后会返回特殊值,如null。大部分方法基本上都是可以根据命名来推断其作用,如addFirst,当然就是从队列头部插入,removeLast,便是从队列尾部移除,get和peek只获取元素而不移除,getFirst方法调用时,如果队列为空,会抛出NoSuchElementException异常,而peekFirst在队列为空时调用则返回null。

    从队列首部插入/取出

    从队列尾部插入/取出

    失败抛出异常

    失败返回特殊值

    失败抛出异常

    失败返回特殊值

    插入

    addFirst(e)    push()

    offerFirst(e)

    addLast(e)

    offerLast(e)

    移除

    removeFirst()  pop()

    pollFirst()

    removeLast()

    pollLast()

    获取

    getFirst()

    peekFirst()

    getLast()

    peekLast()

    常用阻塞队列给出的方法

    方法\处理方式

    抛出异常

    返回特殊值

    一直阻塞

    超时退出

    插入方法

    add(e)

    offer(e)

    put(e)

    offer(e,time,unit)

    移除方法

    remove()

    poll()

    take()

    poll(time,unit)

    检查方法

    element()

    peek()

    不可用

    不可用

    PriorityQueue队列是优先级非阻塞队列,方法都是类似的不多说了。可以参考之前写的阻塞优先级队列。

    https://my.oschina.net/uwith/blog/3057856

    ConcurrentLinkedQueue队列是基于链表的非阻塞队列,感觉没啥区别,只是底层是通过链表来实现的。非阻塞方法和上面的ArrayDeque类似,只是他的只能向队列尾部添加数据,所以没有Last和First方法。总的没啥不一样的地方。用法也比较简单不细记录了。

    简单写下代码测试吧

    package com.example.web.web;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    import java.util.ArrayDeque;

    import java.util.concurrent.ConcurrentLinkedQueue;

    import java.util.concurrent.TimeUnit;

    @RestController

    public class HomeController {

    @RequestMapping("/index")

    public String index() throws Exception {

    ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();

    //生产者

    new Thread(() ->

    {

    try {

    for (int i = 0; i < 5; i++) {

    System.out.println("生产者begin");

    queue.offer("测试数据" + i);

    System.out.println("生产者end");

    }

    } catch (Exception ex) {

    System.out.println(ex);

    }

    }).start();

    //消费者

    new Thread(() ->

    {

    try {

    for (int i = 0; i < 6; i++) {

    System.out.println("==消费者begin");

    TimeUnit.SECONDS.sleep(1);

    String aa = queue.poll();

    System.out.println("==消费者end" + aa);

    }

    } catch (Exception ex) {

    System.out.println(ex);

    }

    }).start();

    //主线程也等待下

    TimeUnit.SECONDS.sleep(15);

    return "网站已得到响应";

    }

    }

    收工........

    参考链接:

    ArrayDeque:https://www.cnblogs.com/mfrank/p/9600137.html

    展开全文
  • ```java public int size() { int count = 0; // first()获取第一个具有非空元素的节点,若不存在,返回null // succ(p)方法获取p的后继节点,若p==p,next,则返回head,表示回到头部重新开始找 for (Node...
  • 阻塞二字其实不难理解,对于学习过操作系统的朋友来说,阻塞就更不是什么陌生的词语了。 对列在数据结构中也有所涉及 但是当二者放在一起又会擦出...非阻塞队列 队列里面没有数据时,操作队列出现异常或返回nul...

    在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞,一个是以BlockingQueue接口为代表的阻塞队列.
    在这里插入图片描述

    非阻塞队列

    队列里面没有数据时,操作队列出现异常或返回null,不具有等待/阻塞的特色

    ConcurrentLinkedQueue : 是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue.它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的,该队列不允许有null元素

    阻塞队列

    阻塞队列一般附加两种操作:

    1. 在队列为空时,获取元素的线程会等待队列变为非空。
    2. 当队列满时,存储元素的线程会等待队列可用。

    例子:

        public static void main(String[] args) throws InterruptedException {
            BlockingQueue<String> blockingQueue=new ArrayBlockingQueue<>(3);
            blockingQueue.offer("新年");
            blockingQueue.offer("快乐",3, TimeUnit.SECONDS);
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll(3,TimeUnit.SECONDS));
            System.out.println(blockingQueue.poll(3,TimeUnit.SECONDS));
    
        }
    

    结果:
    在这里插入图片描述
    PS:对列中可以存放三个数据,第三个数据为空,取出第三个数据时加延迟,就会延迟处理。尽管第二个数据也加延迟了,但是因为有数据因此不会延迟。

    展开全文
  • java 中 阻塞队列 非阻塞队列 和普通队列的区别

    万次阅读 热门讨论 2018-08-22 23:14:26
    阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列...
  • 1.阻塞队列和非阻塞队列的区别 阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列wait(),notify()进行队列消息传送。而阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,...
  • import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.LinkedBlockingQueue;import java.util.concu...
  • 如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。 //使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的...
  • 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列...
  • JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
  • 方式一:importjava.util..../***使用非阻塞队列PriorityQueue以及notify(),wait()机制实现一个阻塞队列*@authoruser**/publicclassMyBlockingQueue{publicfinalstaticintqueueSize=10;publicstaticPriorityQueue...
  • java同步队列,包括非阻塞队列与阻塞队列
  • Java阻塞队列四组API介绍通过前面几篇文章的学习,我们已经知道了Java中的队列分为阻塞队列和非阻塞队列以及常用的七个阻塞队列。如下图:本文来源:凯哥Java(kaigejava)讲解Java并发系列之阻塞队列教程。系列文章,...
  • 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列满;从阻塞队列取数据时,...
  • java包中有一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的阻塞队列。通过这两种队列,我们保证了多线程操作数据的安全性。 java集合中的...
  • java阻塞队列以及非阻塞队列

    千次阅读 2014-04-16 23:44:43
    1.阻塞队列: submit(producer1);  executorService.submit(producer2);  executorService.submit(producer1);  Consumer consumer = new Consumer("consumer1");  executorServi
  • 阻塞队列 BlockingQueue接口下的各个实现类及部分源码介绍,BlockingQueue 对插入操作、移除操作、获取元素操作提供了四种不同的方法用于不同的场景中使用: 抛出异常,如果队列为空或队列已满直接抛异常 返回特殊...
  • 阻塞队列和非阻塞队列(JAVA)

    千次阅读 2019-08-11 16:36:43
    非阻塞队列2.1 代码举例2.2 ConcurrentLinkedQueue 1.阻塞队列 1.1 代码举例 1个生产者,队列元素大小为2,三个消费者消费 public class TestQueue { private int queueSize = 2; private BlockingQue...
  • 如果您没有其他任何操作,只想等待(不使用CPU),直到数据可用,则使用阻塞队列.这正是它的制作方式,使用像take这样的方法:Retrieves and removes the head of the queue represented by this deque (in other words, ...
  • 阻塞队列:线程安全 按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接...
  • java中的阻塞和非阻塞队列 实现一个队列的线程安全,有两种方式: 1)使用阻塞队列,即出队和入队共用一把锁或者各自使用一把锁来实现 2)非阻塞队列:可以利用循环CAS的方式实现 java中的阻塞队列 阻塞队列是一...
  • ArrayBlockingQueueArrayBlockingQueue是一个有界阻塞队列,基于数组、ReentrantLock、Condition实现。 所谓阻塞队列是指,队列满了,则会对生产线程产生阻塞直到有空位可插入; 当队列空了,则会对消费队列产生...
  • 方式一:importjava.util..../***使用非阻塞队列PriorityQueue以及notify(),wait()机制实现一个阻塞队列*@authoruser**/publicclassMyBlockingQueue{publicfinalstaticintqueueSize=10;publicstaticPriorityQueue...
  • 今天要来讲一下java里的队列队列,顾名思义,排队的列,既然按排队形来做的话,生活中的银行排队啊,上车排队啊,都是先到先办理或者先上车,队列存取数据元列也一样,这就是先进先出,使用队列的规则是:使用队素...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,056
精华内容 422
关键字:

java非阻塞队列

java 订阅