蓝桥杯Java课程学习——多线程(二)

文章目录

  • ArrayBlockingQueue
    • 构造方法
    • 入队常用方法
    • 出队常用方法
    • 实例
  • 消费者生产者模型


ArrayBlockingQueue

ArrayBlockingQueue 是由数组支持的有界阻塞队列。位于 java.util.concurrent包下。

构造方法

构造方法 描述
public ArrayBlockingQueue(int capacity) 构造大小为 capacity 的队列
public ArrayBlockingQueue(int capacity, boolean fair) 指定队列大小,以及内部实现是公平锁还是非公平锁
public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c) 指定队列大小,以及锁实现,并且在初始化是加入集合 c

入队常用方法

入队方法 队列已满 队列未满
add 抛出异常 返回 true
offer 返回 false 返回 true
put 阻塞直到插入 没有返回值

出队常用方法

出队方法 队列为空 队列不为空
remove 抛出异常 移出并返回队首
poll 返回 null 移出并返回队首
take 阻塞直到返回 移出并返回队首

实例

import java.util.concurrent.ArrayBlockingQueue;public class ABQDemo {    //构建大小为10的阻塞队列    private static ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(10);    public static void main(String[] args) {        Thread thread1 = new Thread(() -> {            for (int i = 1; i <= 10; i  ) {                arrayBlockingQueue.add(i);            }        });        thread1.start();        try {            //等待线程1执行完毕            thread1.join();//将线程的并行执行改为串行执行        } catch (InterruptedException e) {            e.printStackTrace();        }        new Thread(() -> {            //如果插入失败            if (!arrayBlockingQueue.offer(11)) {                System.out.println("插入元素11失败");            }            try {                //一直阻塞直到插入元素11,注意这里阻塞的不是主线程,main方法还是继续运行                arrayBlockingQueue.put(11);            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        Thread thread2=new Thread(() -> {            Integer element;            System.out.println("开始出队:");            //打印队列中的元素            while ((element = arrayBlockingQueue.poll()) != null) {                System.out.print("\t" element);            }        });        thread2.start();    }}

消费者生产者模型

import java.util.Random;import java.util.concurrent.LinkedBlockingQueue;public class PCModel {    //阻塞队列    private static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();    public static void main(String[] args) {        //生产者        Thread provider = new Thread(() -> {            Random random = new Random();            for (int j = 0; j < 5; j  ) {                try {                    int i = random.nextInt();                    //注释直到插入数据                    queue.put(i);                    System.out.println("生产数据:"   i);                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        //消费者        Thread consumer = new Thread(() -> {            Integer data;            for (int i = 0; i < 5; i  ) {                try {                    //阻塞直到取出数据                    data = queue.take();                    System.out.println("消费数据:"   data);                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        //启动线程        provider.start();        consumer.start();    }}

来源:https://www.icode9.com/content-1-769101.html

(0)

相关推荐

  • java开发技术之Executors创建线程池的弊端

    java开发技术之Executors创建线程池的弊端

  • 写给小白看的线程池,还有10道面试题

    如何搞定20k的面试小抄 为什么要用线程池呢? 下面是一段创建线程并运行的代码: for (int i = 0; i < 100; i++) {     new Thread(() ->  ...

  • 甲状腺体系化课程--学习笔记二

    在8月30日上线的甲状腺病理学体系化课程,朱教授为我们讲述了甲状腺肿瘤性病变-乳头状癌的诊断标准.诸多亚型和鉴别诊断. 面对这样知识点丰富的课程,除了反复观看之外,我们也要利用学习笔记来加深记忆哦.本 ...

  • Java学习-多线程

    多线程 任务(Task).进程(Process).线程(Thread) 进程的创建 1.继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用sta ...

  • java学习——25.二维数组

    如果数组元素又是数组,则称为多维数组,常用的是二维数组. 二维数组可以看成由两个一维数组组成,所以很多东西与一维数组类似,如其声明的方法.可进行的运算等等. 1.声明二维数组 数组类型数组名[][]: ...

  • 《Java 2 实用教程》课程学习(9)

    本章内容 Java把由Component类的子类或间接子类创建的对象称为一个组件: Java把由Container类的子类或间接子类创建的对象称为一个容器: 可以向容器添加一个组件. Componen ...

  • 《基因组学》课程-学习笔记之二

    写在前面 前述,我做了笔记之一.该些内容在高铁上完成学习.回家之后,至今12天,抽空我完成了剩余所有课程的学习,并做笔记之二.这主要在于记录我个人认为值得我记录的知识,而并不是为了给读者学习. 整体上 ...

  • 【衡道丨笔记】妇科病理体系化课程学习笔记(二)

    在衡道医学新媒体开设的「进阶直播课」栏目中,我们有幸请到了深圳市人民医院病理科郭晓静老师,带来了「妇科病理体系化课程」. 为了大家可以更好地学习消化,我们不仅有直播课程回放,还专门请深圳市人民医院的蒋 ...

  • 【衡道丨笔记】泌尿及男性生殖系统病理体系化课程学习笔记(十二)

    由上海交通大学医学院附属瑞金医院病理科主任王朝夫教授主讲的<泌尿及男性生殖系统病理(体系化课程)>每周二.五下午14:00 上线衡道研习社. 配套的学习笔记由瑞金医院病理科泌尿及男性生殖系 ...

  • 皮肤组织病理学体系化课程学习笔记(二)——正常皮肤组织学和皮肤的基本组织病理

    在 4 月 2 日上线的皮肤组织病理学体系化课程中,姜祎群教授为我们讲述了正常皮肤组织学和皮肤的基本组织病理. 小衡分享来自复旦大学附属肿瘤医院的郑强老师的学习笔记,希望下次你也能和我们一起分享~ 复 ...

  • 微表情心理学课程大纲总结二

    情绪与情感 产生 情绪与情感,是伴随认识和意志过程而产生的对外界事物的态度和内心的体验,是对客观事物与主体需要之间关系的反映. 外界事物符合主体需要,引起积极的情绪体验:外界事物不符合主体需要,引起消 ...