zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JUC(5)BlockingQueue四组API

API juc BlockingQueue
2023-09-27 14:26:42 时间

1、读写锁ReadWriteLock

在这里插入图片描述

package com.readlock;

import java.util.HashMap;
import java.util.Map;

/**
 * ReadWriteLock
 */
public class ReadWriteLockDemo {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();

        for (int i = 0; i < 5; i++) {
            final int temp = i;
            new Thread(()->{
              myCache.put(temp+"",temp+"");//写入
            },String.valueOf(i)).start();

        }

        for (int i = 0; i < 5; i++) {
            final int temp = i;
            new Thread(()->{
                myCache.get(temp+"");//读取
            },String.valueOf(i)).start();

        }


    }

}

class MyCache{
    private volatile Map<String,Object> map =new HashMap<>();


    //写
    public void put(String key,Object value){
        System.out.println(Thread.currentThread().getName()+"写入"+key);
        map.put(key,value);
        System.out.println(Thread.currentThread().getName()+"写入成功");

    }

    //读
    public void get(String key){
        System.out.println(Thread.currentThread().getName()+"读取"+key);
        Object o = map.get(key);
        System.out.println(Thread.currentThread().getName()+"读取成功");

    }
}

测试结果(正常情况下:写入、写入成功)
在这里插入图片描述

2、阻塞队列

  • 写入:如果队列满了,就必须阻塞等待
  • 取:如果是队列是空的,必须阻塞等待产生

在这里插入图片描述
BlockingQueue
什么情况下我们会使用阻塞队列:多线程并发处理,线程池!

学会使用队列
添加、移除

3、四组API

1、抛出异常

  • 2、不会抛出异常
  • 3、阻塞、等待
  • 4、超时等待
方式抛出异常有返回值,不抛出异常阻塞等待超时等待
添加addoffer()put()offer(,)
移除removepoll()take()poll(,)
判断队列首elementpeek--

2.1 抛出异常

add 和remove会抛出异常。队列满继续添加数据到队列,队列空,继续取出元素

package com.blockingqueue;

import java.util.concurrent.ArrayBlockingQueue;

public class BlockingQueueDemo {
    public static void main(String[] args) {
        test1();
    }

    /**
     * 抛出异常
     */
    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"));

        /**
         * 抛出异常:java.lang.IllegalStateException: Queue full
         * System.out.println(blockingQueue.add("c"));
         */
        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());
         */
        

    }
}

查看队首元素
在这里插入图片描述

2.2 不抛出异常

off 和 poll
在这里插入图片描述

使用offer不抛出异常
在这里插入图片描述

使用poll、源码
在这里插入图片描述

2.3 阻塞等待

put 和 take
在这里插入图片描述

2.4 超时等待

如果队列满了、设置超时时间、当过了这个超时时间,自动退出
在这里插入图片描述

在这里插入图片描述