线程基础篇(十五)之使用ReentrantLock实现消费者生产者

2023-11-11

/**
 * @author Dora
 * @date 2020/4/8 9:55
 **/
public class QueueLearn {
    // 使用读写锁 实现队列的消费
    // 实现一个队列
  static   ConcurrentLinkedQueue queue=new ConcurrentLinkedQueue();

  // 获取锁
  static ReentrantLock lock=new ReentrantLock();
  static   Condition condition = lock.newCondition();

    public static class Productor implements Runnable{
        // 传入一个要被生产的队列
        @Override
        public void run() {
            lock.lock();
            try {
                // 生产者
                for (int i = 0; i < 10; i++) {
                    if(queue.size()==5){
                        try {
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    queue.add("这是第"+i+"个我生产的物品");
                    condition.signal();
                }

            }finally {
                lock.unlock();
            }

        }
    }


    public static class Coustomer implements Runnable{
        @Override
        public void run() {
            lock.lock();
            try {
                for (int i = 0; i < 10; i++) {
                    if(queue.size()==0){
                        try {
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(queue.poll());
                    condition.signal();
                }

            }finally {
                lock.unlock();
            }

        }
    }

    public static void main(String[] args) {
        new Thread(new Productor()).start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new Coustomer()).start();
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程基础篇(十五)之使用ReentrantLock实现消费者生产者 的相关文章

  • C++11多线程(三) lock_guard unique_lock

    文章目录 C 11多线程 三 lock guard unique lock 导读 Lock guard 示例代码 lock guard lt gt 的第二个参数 unique lock unique lock源码浅析 部分 unique l
  • Linux 多线程原理深剖

    目录 传统艺能 Linux 线程 phread 二级页表 线程优点 线程缺点 线程异常 进程与线程 多线程共享 Linux线程控制 POSIX线程库 线程的创建 获取线程id 线程等待 线程终止 线程分离 进程地址空间布局 传统艺能 小编是
  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • java多线程中synchronized同步代码块执行问题

    在高洪岩老师的 java多线程编程核心技术 一书的用同步代码块解决同步方法的弊端一节中 p76页 有这样一句话 当一个线程访问object的一个synchronized同步代码块时 另一个线程依然可以访问该object对象中的非synchr
  • 静态代理模式

    package com kuang Demo04 静态代理总结 真实对象和代理对象都要实现同一个接口 代理对象要代理真实对象 好处 代理对象可以做很多真实对象做不了的事情 真实对象可以专注做自己的事情 public class Static
  • Java的线程同步 & 并发操作

    并发 CUP在同一时间或同一时段内只能执行一件事情 而不同时件执行时 切换得十分快速 因为CUP的频率非常高 切换的速度人根本感受不出来 同步 同步是多个任务进行时 按照一定的规律进行着 线程并发 同一时间间隔中 有多个线程在同时执行 就是
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • volatile和synchronized的区别

    共性 volatile与synchronized都用于保证多线程中数据的安全 区别 1 volatile修饰的变量 jvm每次都从主存 主内存 中读取 而不会从寄存器 工作内存 中读取 而synchronized则是锁住当前变量 同一时刻只
  • java多线程使用教程

    文章目录 如何使用多线程 继承Thread类 实现Runnable接口 线程的生命周期 线程同步 线程间通信 shutdown 方法的重要性 如何使用多线程 在Java中 创建多线程的方式有两种 一种是继承Thread类 另一种是实现Run
  • Future 和 Callable

    一 Runnable 缺陷 不能返回一个返回值 不能抛出 checked Execption 二 Callable接口 类似于Runnable 被其他线程执行的任务 实现call方法 有返回值 三 Future的作用 Callable和Fu
  • Cuda Streams的概述(四)-- 同步

    同步 同步的APIs 同步所有的事情 阻塞host端 直到所有的CUDA调用完成 cudaDeviceSynchronize 同步主机端特定的流 阻塞host端 直到流里的CUDA调用完成 cudaStreamSynchronize str
  • C++-std::unique_lock介绍和简单使用

    unique lock std unique lock比std lock guard更灵活 这种灵活性主要体现在以下几点 lock guard在构造时或者构造前 std adopt lock 就已经获取互斥锁 并且在作用域内保持获取锁的状态
  • [QT编程系列-25]:多线程机制 - QThread和MoveToThread简介

    目录 第1章 简介 1 1 多线程的目的 1 2 QThread多线程使用方法 1 3 QT支持多线的步骤 第2章 QThread 2 1 概述 2 2 moveToThread 第1章 简介 1 1 多线程的目的 QThread类提供了一
  • python网络爬虫实战——实时抓取西刺免费代理ip

    参考网上高手示例程序 利用了多线程技术 Python版本为2 7 coding utf8 import urllib2 import re import threading import time rawProxyList checkedP
  • 阿里巴巴开发手册-并发处理

    强制 获取单例对象要线程安全 在单例对象里面做操作也要保证线程安全 说明 资源驱动类 工具类 单例工厂类都需要注意 强制 线程资源必须通过线程池提供 不允许在应用中自行显式创建线程 说明 使用线程池的好处是减少在创建和销毁线程上所花的时间以
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • 多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件 支持暂停 取消 断点续传 多线程同时下载文件即 在同一时间内通过多个线程对同一个请求地址发起多个请求 将需要下载的数据分割成多个部分 同时下载 每个线程只负责下载其中的一部分 最后将每一个线程下载的部分组装起来即可 涉及的知
  • 由一个多线程共享Integer类变量问题引起的。。。

    假设并发环境下 业务代码中存在一些统计操作 为了保证线程安全 开发人员往往会对计数值进行加锁 synchronized 值得注意的是 直接对Integer类型进行加锁 似乎并不会达到预期效果 比如下面这段代码 Integer num new
  • JUC的常见类

    目录 Callable ReentrantLock Semaphore CountDownLatch JUC 即 java util concurrent 其中存放了一些进行多线程编程时有用的类 Callable Callable是一个接口
  • 线程安全的集合类

    Java中提供了许多集合类 其中有的是线程安全的 有的是线程不安全的 线程安全的集合类有 1 Vector Vector类实现了一个 动态数组 与ArrayList相似 但Vector是同步访问的 2 Stack Stack是Vector的

随机推荐

  • 活动报名

    活动议程 日期 8月11日 周五 时间 主题 14 30 14 35 开场简介 吴琦 阿德莱德大学副教授 青源会会员 14 35 15 20 实际应用中的通用视觉与语言方法 聚焦于视觉与语言导航任务 乔滟媛 阿德莱德大学博士后研究员 15
  • vue_02_数据绑定

    1 单向数据绑定 语法 v bind href xxx 或简写为 href 特点 数据只能从 data 流向页面
  • 大乐透分析软件

    大乐透分析软件 1 使用python从网站中爬取所有的大乐透中奖号码 2 使用c 分析红球 蓝球 组合重复出现次数 3 输入红球 蓝球判断历史中奖次数和出现次数 python爬取代码 import os import re import t
  • 【OpenCV图像处理】1.26 直方图反向投影(Back Projection)

    1 相关理论 反向投影 反向投影是反映直方图模型在目标图像中的分布情况 简单点说就是用直方图模型去目标图像中寻找是否有相似的对象 通常用HSV色彩空间的HS两个通道直方图模型 反向投影 步骤 1 建立直方图模型 2 计算待测图像直方图并映射
  • 【SqlServer】如何实现用一个表中的数据修改另一个表中的数据?

    问 我想根据一定的条件实现用一个表中的数据修改另一个表中的数据 这该如何办到呢 答 这有何难 用SQL语言UPDATE嘛 表一 student stu id stu name stu age 1 aa 20 2 bb 21 3 cc 22
  • 小程序跳转外链

    注意 个人类型和海外类型的小程序不支持 web view 标签 直接跳转显示如下页面 解决方案1 将外链地址配置在微信公众的白名单中即可正常跳转 解决方案2 新建一个 fbec number collection用web view承载它以后
  • Oracle-Rman详解

    RMAN 使用详解 一 连接方式 一 连接本地数据库 oracle oracle rman target 二 连接远程数据库 oracle oracle rman target sys oracle orcl 二 基本指令 一 执行 SQL
  • Java线程(从基本概念到线程安全,超详细加大量代码实现)

    线程 线程基本概念 一个线程是一个程序内部的顺序控制流 线程和进程 每个进程都有独立的代码和数据空间 进程上下文 进程切换的开销大 线程 轻量的线程 同一类线程共享和数据空间 每个线程有独立的运行栈和程序计数器 PC 线程切换的开销小 多进
  • 计算机视觉(三):神经网络最优化过程

    计算机视觉笔记总目录 1 最优化 Optimization 定义 最优化是寻找能使得损失函数值最小化的参数 W W W的过程 注 给的是损失优化问题的一个简单定义 并不是完整的最优化数学定义 方法 问题陈述 这节的核心问题是 给定函数 f
  • Search in rotated sorted Array

    算法框架和普通折半查找一样 主要变量就是begin end mid 考虑的区间也一样 都是 begin mid mid mid end 这三种情况 只是判断条件的部分不同 1 若target A mid 返回mid 2 之后只有两种情况 t
  • 跨时钟域传输数据——单bit和多bit信号(总结)

    文章目录 前言 一 慢时钟域到快时钟域 1 单bit信号 2 多bit信号 二 快时钟域到慢时钟域 1 单bit信号 2 多bit信号 三 多bit信号跨时钟域传输 1 多个信号合并 2 多周期路径 Multi cycle Path MCP
  • MySql的增删改查操作(初学者个人心得)

    引言 在上周粗略的学习了有关MySql的相关基础内容 为了方便自己复习 特写下这篇个人心得 来记录MySql有关增删改查操作的内容 MySql学习中最重要的一部分 启动数据库 DOS命令进入mysql的bin文件夹 net start my
  • Linux服务器安全 SSH 用户密钥认证登录

    一 SSH基本简介 SSH 提供两种安全验证方式 1 基于口令 客户端使用账号和口令登录服务器 所有传输数据都会被加密 但可能存在伪造服务器冒充真正的服务器与客户端进行交互 不能避免中间人攻击 2 基于密钥 使用一对密钥 私钥 公钥 将公钥
  • ReentrantLock的使用和原理详解

    文章目录 一 ReentrantLock 小例子 二 ReentrantLock的优点 1 可重入 其实synchronized 也是可重入的 2 可中断 3 可限时 3 公平锁 一 ReentrantLock 小例子 import jav
  • 1 - 选择排序与冒泡排序

    排序算法 选择排序 选择排序的思路 依次遍历数组 每次遍历数组的时候 记录当前未排序的最小值的索引 让最小值的索引和待排序的数组的第一个元素进行交换 然后继续重复操作 直到所有元素都排序 public class SelectionSort
  • 关于JavaScript中map和reduce的分析

    以前看js都是云里雾里的 后来学了一些Java感觉稍微能看懂一些 恰逢又回头看到了以前关于js在有道云上的一些笔记 决定做一个关于map和reduce的分析 map map一般来说针对数组进行操作 但是进行了一个很好的封装使得读者可以清晰的
  • PHP获取二维数组中指定Key的重复Value

  • C++获取类私有成员指针

    获取类首地址 根据成员定义顺序去计算想要的私有成员地址 class A private int a float b public A a 1 b 1 public float getB return b void test A a floa
  • 图书管理系统2.0——mysql数据库

    目录 一 简要介绍 1 使用技术 2 简要功能 3 源码 二 需求文档 1 登录 2 注册 3 用户菜单 3 1 借阅图书 3 1 归还图书 3 2 个人中心 3 2 1 查看所有借阅记录 3 2 2 查看借阅中的图书 3 2 3 签到领积
  • 线程基础篇(十五)之使用ReentrantLock实现消费者生产者

    author Dora date 2020 4 8 9 55 public class QueueLearn 使用读写锁 实现队列的消费 实现一个队列 static ConcurrentLinkedQueue queue new Concu