线程之BlockingQueue

从FinFET到GAA:手把手解读2nm芯片制造的关键技术(含BSPDN避坑指南) 本文深入解读了2nm芯片制造从FinFET向全环绕栅极(GAA)晶体管架构演进的核心技术,并重点剖析了背面供电网络(BSPDN)的三种实现路径及其工程挑战。文章旨在帮助工程师理解技术变革的内在逻辑,并为应对2nm节点设计中的关键问题提供实用指南。 阅读详情

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.本例再次实现11.4线程----条件Condition中介绍的篮子程序,不过这个篮子中最多能放的苹果数不是1,可以随意指定.当篮子满时,生产者进入等待状态,当篮子空时,消费者等待.

*/

/**

使用BlockingQueue的关键技术点如下:

 1.BlockingQueue定义的常用方法如下:

1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则招聘异常

2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.

3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.

4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null

5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止

2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类

1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.

2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的

3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.

4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.

3.LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue. 

*/

public class BlockingQueueTest {

    /**定义装苹果的篮子*/
    public static class Basket {
        BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3); //篮子,能够容纳3个苹果

        //生产苹果,放入篮子
        public void produce() throws InterruptedException {

            //put方法放入一个苹果,若basket满了,等到basket有位置
            basket.put("An apple");
        }

        //消费苹果,从篮子中取走
        public String consume() throws InterruptedException {

            //take方法取出一个苹果,若basket为空,等到basket有苹果为止
            return basket.take();
        }
    }

    //测试方法
    public static void testBasket() {
        final Basket basket = new Basket();//建立一个装苹果的篮子

        //定义苹果生产者
        class Producer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        System.out.println("生产者准备生产苹果: " + System.currentTimeMillis()); //生产苹果
                        basket.produce();
                        System.out.println("生产者生产苹果完毕: " + System.currentTimeMillis());
                        Thread.sleep(300); //休眠300ms
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        //定义苹果消费者
        class Consumer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        System.out.println("消费者准备消费苹果: " + System.currentTimeMillis()); //消费苹果
                        basket.consume();
                        System.out.println("消费者消费苹果完毕: " + System.currentTimeMillis());
                        Thread.sleep(1000); //休眠1000ms
                    }
                } catch(InterruptedException ex) {
                }
            }
        }

        ExecutorService service = Executors.newCachedThreadPool();
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        service.submit(producer);
        service.submit(consumer);

        //程序运行5s后,所有任务停止
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
        }
        service.shutdownNow();
    }

     public static void main(String[] args){
         BlockingQueueTest.testBasket();
     }
}

 


转自:http://www.cnblogs.com/likwo/archive/2010/07/01/1769199.html

Yandex复杂还原验证码识别 本文分析了Yandex滑动验证码的识别方法,指出其通过JS判断正确滑动位置而非用户交互还原图像。核心思路是通过像素差异分析,将验证码图像重组后(分为3×3或4×4),计算相邻图像间的像素差异,最小值即为正确位置。与前期某象验证码识别方法类似,需结合图像增强技术统一像素直方图。文章强调该方法仅供学习参考,严禁用于违法行为。完整识别流程包括图像重组、像素差异计算等步骤,最终可准确定位正确拼图位置。 阅读详情

相关推荐

CAN基础知识

CAN基础知识

shouchen1的博客 9146

多线程-了解BlockingQueue的实现方式-线程安全队列

BlockingQueue是Java并发包中提供的一个接口,是实现生产者消费者模式的关键组件之一,是一个基于阻塞机制实现的线程安全的队列,阻塞机制的实现是通过入队列出队列时加锁的方式实现的。作为生产者消费者中间的通讯通道,使得当多个生产者、多个消费者之间的操作是线程安全的。

rainyonelove的专栏 2054

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 790

线程池的核心——BlockingQueue

前言 本篇文章会介绍BlockingQueue的概念。 BlockingQueue是java线程池的核心。无论是在面试还是工作中,都是必知必会的知识点。 BlockingQueue的名字就完美概括了这个接口的特点,Queue 是BlockingQueue的父接口,说明它本质还是一个队列。Blocking意为阻塞,说明BlockingQueue相对于普通队列,新增了阻塞的特性。 本文会从BlockingQueue的父接口Queue开始聊起,包括Queue在java 容器中的定位以及API等等。然后介绍Bloc

asd13518662的博客 1246

基于MySQL的京东用户行为分析

对京东用户行为的分析,利用AARRR模型进行分析。

SelenaSelena的博客 1910

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战

本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。

weixin_30729609的博客 387

深入理解Java并发:阻塞队列(BlockingQueue)核心解析

是 Java 并发编程中不可或缺的工具,它将复杂的线程同步问题封装在简洁的 API 背后。通过理解其阻塞特性核心方法不同实现的差异(特别是和的锁机制)以及内部实现原理,我们能更加自如地应对并发挑战。无论是构建生产者-消费者模型,还是配置线程池,选择并正确使用合适的都是保证程序高效、稳定运行的关键。

冷脸萌萌的技术实践 4112

S7-PLCSIM Advanced V3.0虚拟PLC组态下载失败?手把手教你解决IP地址冲突问题

本文针对S7-PLCSIM Advanced V3.0组态下载失败问题,深入剖析了IP地址冲突的根本原因。通过对比博途项目PLC、虚拟网卡及本机物理网卡的IP配置,提供了清晰的排查流程与标准化解决方案,帮助用户快速修复网络可达性问题,确保虚拟PLC仿真顺利进行。

weixin_29306261的博客 193

BlockingQueue(阻塞队列)详解

BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 二. 认识Bl...

kaven 2222

Xlinx PG151 除法器IP 笔记

对Xlinx 除法器IP PG151中部分内容记录备忘。

weixin_50515160的博客 2528

【系统移植】 移植主线U-Boot(v2024.01-rc3)到RK3399

[系统移植] 移植主线U-Boot(v2024.01-rc3)到RK3399

Systemcall名屋 1004

BlockingQueue-线程的阻塞队列

BlockingQueue作为线程容器,可以为线程同步提供有力的保障,其主要用到的方法包括: [java]view plaincopy add(Eo);//将指定的元素添加到此队列中(如果立即可行),在成功时返回true,其他情况则抛出IllegalStateException。 drainTo(Collection<?super...

weixin_30396699的博客 314

YOLOv11涨点改进 | 全网独家创新,损失函数改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出了一种改进YOLOv11模型的AdaFocalLoss损失函数,通过动态调节机制有效提升小目标检测性能。AdaFocalLoss融合了目标尺寸感知和IoU引导的自适应调节,解决了传统损失函数在小目标检测中的样本不平衡问题。该方法自动调整训练权重,无需手动调参,显著提升了模型在多尺度目标、复杂背景下的检测精度和训练稳定性。实验表明,AdaFocalLoss能更好地平衡不同尺度目标的梯度分布,改善边界完整性,减少误检漏检。文章详细介绍了算法原理、实现代码和在YOLOv11中的集成方法,为提升目标检测性能

Ai缝合怪、助力小伙伴高效发论文 335

Java线程池中BlockingQueue的作用

关于线程池中BlockingQueue的疑问 对于Java线程池,相信大家都或多或少使用过。关于其用法和原理介绍,网上已经有很多非常精彩的文章,珠玉在前,我就不献丑了。不了解的,可以参考这篇文章。今天我想讲的,是关于我对Java线程次的两个疑问,当然高手可以略过了。 1.为什么线程池要使用BlockingQueue,而不是ArrayList或别的什么列表? 2.既然使用了Blo...

imxishang的博客 3054

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JAVA 线程池 BlockingQueue详解

BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。boolean add(E e) :将元素添加到队列尾部,如果队列满了,则抛出异常 IllegalStateException。boolean offer(E e):将元素添加到队列尾部,如果队列满了,则返回 false。

2402_82958989的博客 1033

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何停止被BlockingQueue阻塞的线程

如下阻塞队列+线程的代码,很常见,当服务停止时,如何停止被BlockingQueue阻塞的线程? BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue(10); final Thread thread = new Thread(new Runnable() { @Override public voi...

零壹视界 3132

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java BlockingQueue阻塞队列是线程安全的吗 是线程安全的

welcome to my blog 问题描述 Java BlockingQueue 阻塞队列的take()和put()方法是线程安全的吗? 多线程下调用take()或者put()方法会出问题吗? 看了BlockingQueue的三个实现类, 发现对应的方法中都使用了锁, 所以不会出现线程安全问题 ArrayBlockingQueue //ArrayBlockingQueue的put()方法 ...

littlehaes的博客 1万+

BlockingQueue接口和线程池

BlockingQueue接口和线程池 BlockingQueue接口 它有四套api,add/remove操作失败会直接抛出异常,offer/poll操作失败会返回特殊值,还可以加时间,过了时间返回失败,put/take操作失败会阻塞。 ArrayBlockingQueue:是数组实现的,必须构造时传入大小,传入后不可改变。 DelayQueue:实现Delay接口,与排序有关,它是一...

dig73817的博客 266

Java多线程——BlockingQueue特点总结

概述 最初接触BlockingQueue肯定是通过Java的线程池ThreadPoolExecutor的,在使用Executors创建四种线程池的时候,默认帮我制定了使用的BlockingQueue,如下: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

保暖透气大裤衩LeoLee的博客 538

线程池原理--任务队列BlockingQueue

文章目录线程池原理--任务队列BlockingQueue 线程池原理–总索引 线程池原理–任务队列BlockingQueue

皮蛋瘦肉的博客 4329

java workqueue_Java线程池中BlockingQueue的作用

关于线程池中BlockingQueue的疑问对于Java线程池,相信大家都或多或少使用过。关于其用法和原理介绍,网上已经有很多非常精彩的文章,珠玉在前,我就不献丑了。不了解的,可以参考这篇文章。今天我想讲的,是关于我对Java线程次的两个疑问,当然高手可以略过了。1.为什么线程池要使用BlockingQueue,而不是ArrayList或别的什么列表?2.既然使用了BlockingQueue,为什...

weixin_30646295的博客 761

C++11 线程安全的BlockingQueue实现

C++11 BlockingQueue

大黄鸭 8190

java多线程:BlockingQueue

Queue队列遵循了先进先出的原则 BlockingQueue继承了Queue 可以通过IDEA的UML图看出彼此的关系: BlockingQueue :阻塞队列 向队列尾添加元素(put()方法)时,若队列已经塞满,则当前线程会被阻塞,直到队列中元素被消费,出现空余位置,则线程继续工作 向队列头取元素(take()方法)时,若队列为空,则当前线程会被阻塞,直到队列中出现新的元素,当...

EnseHeiKe的博客 348

多线程:线程池里的队列BlockingQueue

runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列: BlockingQueue的几个注意点 【1】BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put 附加元素。没有任何内部容量约束的BlockingQueue 总是报告Integer.MAX_V...

五山口老法师 1410

线程BlockingQueue

BlockingQueue

都市游侠的专栏 536

多线程中的BlockingQueue你知道的有多少?

在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。

程序员伊成 2024
上一篇: Callable,Runnable比较及用法
下一篇: Java 线程池学习
HabbyGe
博客等级 码龄16年 46粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值