码迷,mamicode.com
首页 > 其他好文 > 详细

阻塞队列

时间:2021-05-24 02:27:19      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sys   lstat   getname   img   inter   api   ati   pac   alt   

阻塞队列

技术图片

阻塞队列:

技术图片

技术图片

BlockingQueue BlockingQueue 不是新的东西

技术图片

什么情况下我们会使用阻塞队列:多线程并发处理,A->B 线程池!

学会使用队列

添加、移除

四组API

方式 抛出异常 不会抛出异常,有返回值 阻塞等待 超时等待
添加 add offer() put() offer(,,)
移除 remove poll() take() poll(,)
检测队首元素 element peek - -
   /**
     * 抛出异常
     */
    public static void test1(){
        //队列的大小
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));
        //IllegalStateException: Queue full 抛出异常!
        //System.out.println(blockingQueue.add("d"));

        System.out.println("=============================");

        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());

        //java.util.NoSuchElementException 没有元素 抛出异常!
        //System.out.println(blockingQueue.remove());
    }
/**
 * 有返回值,没有异常
 */
public static void test2(){
    //队列的大小
    ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

    System.out.println(blockingQueue.offer("a"));
    System.out.println(blockingQueue.offer("b"));
    System.out.println(blockingQueue.offer("c"));

    //System.out.println(blockingQueue.offer("d")); //false 不抛出异常!
    System.out.println("===============================");
    System.out.println(blockingQueue.poll());
    System.out.println(blockingQueue.poll());
    System.out.println(blockingQueue.poll());
    System.out.println(blockingQueue.poll());   //null  不抛出异常!
}
/**
 * 等待,阻塞(一直阻塞)
 */
public static void test3() throws InterruptedException {
    //队列的大小
    ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

    //一直阻塞
    blockingQueue.put("a");
    blockingQueue.put("b");
    blockingQueue.put("c");
    //blockingQueue.put("d"); //队列没有位置了,一直阻塞

    System.out.println(blockingQueue.take());
    System.out.println(blockingQueue.take());
    System.out.println(blockingQueue.take());
    System.out.println(blockingQueue.take()); // 没有这个元素,一直阻塞
}
/**
 * 等待,阻塞(等待超时)
 */
public static void test4() throws InterruptedException {
    //队列的大小
    ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

    blockingQueue.offer("a");
    blockingQueue.offer("b");
    blockingQueue.offer("c");
    //blockingQueue.offer("d",2, TimeUnit.SECONDS); //等待超过2秒就退出
    System.out.println("=======================================");
    System.out.println(blockingQueue.poll());
    System.out.println(blockingQueue.poll());
    System.out.println(blockingQueue.poll());
    blockingQueue.poll(2,TimeUnit.SECONDS);//等待超过2秒就退出

}

SynchronousQueue 同步队列

没有容量,

进去一个元素,必须等待取出来之后,才能再往里面放一个元素!

put、take

package com.chao.bq;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/**
 * 同步队列
 * 和其他的BlockingQueue 不一样,SynchronousQueue 不存储元素
 * put 了一个元素,必须从里面先take取出来,否则不能在put进去值!
 */
public class SynchronousQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); //同步队列

        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName()+":"+"put 1");
                blockingQueue.put("1");
                System.out.println(Thread.currentThread().getName()+":"+"put 2");
                blockingQueue.put("2");
                System.out.println(Thread.currentThread().getName()+":"+"put 3");
                blockingQueue.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T1").start();

        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T2").start();
    }
}

阻塞队列

标签:sys   lstat   getname   img   inter   api   ati   pac   alt   

原文地址:https://www.cnblogs.com/Answer-Chao/p/14746895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!