import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class MyQueue {
//1 需要一个承装元素的集合
private LinkedList<Object> list = new LinkedList<Object>();
//2 需要一个计数器
private AtomicInteger count = new AtomicInteger(0);
//3 需要制定上限和下限
private final int minSize = 0;
private final int maxSize ;
//4 构造方法
public MyQueue(int size){
this.maxSize = size;
}
//5 初始化一个对象 用于加锁
private final Object lock = new Object();
//put(anObject): 把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断,直到BlockingQueue里面有空间再继续.
public void put(Object obj){
synchronized (lock) {
while(count.get() == this.maxSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//1 加入元素
list.add(obj);
//2 计数器累加
count.incrementAndGet();
//3 通知另外一个线程(唤醒)
lock.notify();
System.out.println("新加入的元素为:" + obj);
}
}
//take: 取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入.
public Object take(){
Object ret = null;
synchronized (lock) {
while(count.get() == this.minSize){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//1 做移除元素操作
ret = list.removeFirst();
//2 计数器递减
count.decrementAndGet();
//3 唤醒另外一个线程
lock.notify();
}
return ret;
}
public int getSize(){
return this.count.get();
}
public static void main(String[] args) {
final MyQueue mq = new MyQueue(5);
mq.put("a");
mq.put("b");
mq.put("c");
mq.put("d");
mq.put("e");
System.out.println("当前容器的长度:" + mq.getSize());
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
mq.put("f");
mq.put("g");
}
},"t1");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
Object o1 = mq.take();
System.out.println("移除的元素为:" + o1);
Object o2 = mq.take();
System.out.println("移除的元素为:" + o2);
}
},"t2");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
相关推荐
Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧
本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。
java 使用线程模拟 队列实现
package com.bjsxt.base.conn009; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class MyQueue { //1 需要一个承装元素的集合 priva
药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)
本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。
使用 wait notify 实现一个队列,队列有2个方法,add 和 get 。add方法往队列中添加元素,get方法往队列中获得元素。队列必须是线程安全的。如果get执行时,队列为空,线程必须阻塞
如题: 使用 wait notify 实现一个队列,队列有2个方法,add 和 get 。add方法往队列中添加元素,get方法往队列中获得元素。队列必须是线程安全的。如果get执行时,队列为空,线程必须阻塞等待,直到有队列有数据。如果add时,队列已经满,则add线程要等待,直到队列有空闲空间。 实现这么一个队列,并写一个测试代码,使他工作在多线程的环境下,证明,它的工作是正确的。给出程序和运...
卷积神经网络中的边缘检测:从Canny算法到深度学习(PyTorch实现)
本文系统梳理了边缘检测从经典Canny算法到深度学习方法的演进,重点解析了Canny算法的数学原理及其对卷积神经网络设计的深远影响。通过PyTorch实战,详细演示了如何构建并训练一个基于HED架构的深度学习边缘检测模型,并探讨了模型优化、评估及与传统方法融合的高级技巧。
新建菜单Office被替换为腾讯文档 - 解决方案
右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。
利用wait/notify模拟消息队列
利用 wait/notify 模拟消息队列 一个简易版的消息队列模型: 这里一共有四种角色: queue:消息队列; Publisher:消息发布者,可以向任何一个队列发布消息; Listener:消息监听者,一个 Listener 同时只能监听一个 queue 的消息;但一个 queue 可同时被多个 Listener 监听; MqServer:消息队列服务器,负责管理所有的队列。 首先定义 MqServer,queue 都在 MqServer 里面: package per.lvjc.concur
实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用
本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。
【Java互联网架构学习----001--08】使用线程的wait()和notify()方法模拟队列Queue
简单使用wait()和notify()方法模拟队列Queue 过程描述:.定义一个类队列类MyQueue,有两个方法,添加数据和取数据,此队列类有一个容器,容器有最大值和最小值,有一个计数器,还需要有一个对象锁,保证同步,即在多个线程操作同一对象的方法时需要按照我们的意愿进行操作 package com.neo.study001.redio08; import java.util.Link...
实战优化!C#上位机串口通信卡顿问题:超时机制+数据缓存方案
串口名</param>/// <param name="baudRate">波特率
点云去噪:基于点云拟合的方法
点云处理是计算机视觉中的重要任务之一,而点云去噪是点云处理的关键步骤之一。在实际应用中,由于采集设备的噪声、运动估计误差或者环境干扰等因素,点云数据中常常包含有噪声点,这些噪声点会对后续的点云分析和处理造成不良影响。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。该方法通过拟合点云数据的曲面模型,对噪声点进行识别和过滤,从而得到更加干净的点云数据。
java线程阻塞 notify_Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之Reentra...
前言:这几天看了很多关于多线程的知识,分享一波。(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客)关于基本的理论等 参考如下:一:synchronizedsynchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争某个资源的时候会有先后顺序。在java中有三种写...
基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行
基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行
【java】手写一个阻塞队列
阻塞队列与普通的队列的区别就是当队列为空或者满时处理的逻辑不通,普通队列返回特殊值(比如null,false等等)而阻塞队列是阻塞当前线程直到队列有元素或者不为空。 这里手写一个阻塞队列。首先定义一个接口: public interface BlockingQueue<E> { /** * 往队列尾部添加一个元素,当队列满时阻塞当前线程 * @param e */ void put(E e); /** * 从队列首部取走一个元素,
efm32 入门.pdf
本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition...
前言:这几天看了很多关于多线程的知识,分享一波。(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客) 关于基本的理论等 参考如下: https://www.cnblogs.com/LipeiNet/p/6475851.html https://www.cnblogs.com/moongeek/p/7631447.html 一:synchronized ...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
为什么wait/notify必须要和synchronized一起使用?
作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个...
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
为什么wait和notify必须放在synchronized中?
作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个...
wait方法施放锁,notify方法持有锁
先来看下例子,这个例子中明显能看出问题代码如下: package com.testredis; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.conc
为什么Java的wait和notify必须要在synchronized代码块中调用?
让我们看一个例子,如果我们不在synchronized代码块中调用wait()方法会发生什么问题。 假设我们要自己实现一个阻塞队列(当然JDK中已经有了BlockingQueue,这儿只是为了说明问题)。 没有同步(synchronization)的代码可能像下面这样: class BlockingQueue { Queue<String> buffer = new LinkedList<String>(); public void give(String
什么?面试官让我用ArrayList实现一个阻塞队列?
在准备开始详细分析java多线程源码时,发现了这样一个问题,也就是说,在面试的时候经常要求,手写阻塞队列,或者手写一个程序,交替打印1-10000。于是,看到这里经不住动手一试。 基础知识 实际上,要实现一个BlockQueue,实际上就是自己写一个简单的生产者、消费者模型的代码。需要我们实现一个Queue,做为临界区,之后,当临界区不足的时候可以添加元素,当临界区达到阈值的时候则生产者线程等待。同理,对于消费者线程,那么当临界区有元素的时候就可以消费,没用元素的时候就要停止消费。那么我们需要用到 sync
如何实现一个阻塞队列?
阻塞队列的实现
Java可阻塞队列的两种实现方式
在Java中,对于Lock和Condition可以理解为对传统的synchronized和wait/notify机制的替代。 wait/notify有个限制,调用wait/notify的线程必须持有对象的锁。 This method should only be called by a thread that is the owner of this object's monito
一文理解java多线程之生产者消费者模型(三种实现)
生产者和消费者之间通过一个缓冲区来进行交互,生产者负责生成数据,然后存入缓冲区;消费者则负责消费数据,从缓冲区获取。生产者和消费者只和缓冲区交互,没有直接联系。其中的同步互斥关系:生产者之间互斥,消费者之间也互斥生产者与消费者之间既又同步也有互斥(缓冲区满时,只能消费完再生产;缓冲区空时,只能生产完再消费)注意:缓存区要先进先出,所以一般用队列实现为什么要用生产者-消费者模型?
基于Lock Condition实现自己的阻塞队列
前言 本文介绍下JUC包下的Lock以及Condition组件,以及实现自己的阻塞队列 阻塞队列 阻塞队列顾名思义是一个队列,那么为什么叫阻塞队列呢,因为队列是一种生产者/消费者模型,即生产者往队列里面放数据,消费者从队列里面拿数据。 那么当消费者消费消息时发现队列是空的,生产者生产消息发现队列已经满了,此时应该怎么做呢? 阻塞队列就是指在上述情况下生产者和消费者会阻塞 什么是生产者和消费者模式 生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而是通过阻塞
阻塞队列的实现
public class Test1 { static class BlockingQueue{ //普通队列实现方式两种:1.基于链表2.基于数组 private int[] array = new int[1000]; //head和tail构成一个前闭后开区间 当两者重合的时候,可能表示队列空或者满 private int head = 0; private int tail = 0; private int size = 0; //队列的基本操作:1.入队列2.出队列3.取队首元素
java 手写阻塞队列_Java可阻塞队列的两种实现方式
在Java中,对于Lock和Condition可以理解为对传统的synchronized和wait/notify机制的替代。wait/notify有个限制,调用wait/notify的线程必须持有对象的锁。This method should only be called by a thread that is the owner of this object's monitor. See the...
715



被折叠的 条评论
为什么被折叠?



