Java BlockingQueue 阻塞式队列

Java 多线程5——阻塞式队列BlockingQueue的原理 + 消费者生产者模型 + 代码模拟实现 这篇文章教会你如何使用这个多线程中超级无敌好用的数据结构,带你认识消费者生产者模型,并带你手动用代码实现一个阻塞式队列!! 阅读详情

常用 BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue 

​

2014拍摄于四川羌族藏族自治区郎木寺。

微信公众号

 

王皓的GitHub:https://github.com/TenaciousDWang

 

今天这一回,我们来说一下Java并发编程中的阻塞队列BlockingQueue。

 

阻塞队列BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。

 

首先我们现在看一下什么是队列,以下是一个队列模型示例。

 

 

我们可以看到数据由队列的一端输入,从另外一端输出,常用的队列主要有以下两种:

 

1、先进先出(FIFO):在之前我们说AQS时,提出过FIFO这个概念,先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。

 

2、后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 

 

我们再来看一下阻塞队列,我们用一个经典的生产者与消费者的例子来说明,假设有若干生产线程,若干消费线程,生产者线程生产数据供给消费者来消费,如果在一定时间内,生产者的速度大于消费者的速度,那么就会产生过量的数据,这些数据需要被缓存起来,且当缓存装满时,生产者线程需要被挂起暂时停止生产,等待消费者线程将缓存里的数据取走。反之,生产者线程速度跟不上消费者速度则消费者线程应该挂起,等待生产者线程生产数据。

 

在JUC包没有发布之前,要解决这个问题就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦,所有的程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全。

 

JUC包发布之后,为我们带来了BlockingQueue阻塞队列,上面的生产者与消费者例子里,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。

 

根据在生产者和消费者里使用阻塞队列我们来用图片展示一下。

 

 

1、当队列中没有数据的情况下,消费者所有线程都会被自动阻塞,直到有数据放入队列。

 

 

2、当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞,直到队列中有空的位置,生产线程被自动唤醒。

 

 

我们先来看一下BlockingQueue中的核心方法,首先是插入数据:

 

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

 

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

       

3、offer(E e, long timeout, TimeUnit unit)可以设定等待的时间,如果在指定的时间内,还不能往队列中加入,则返回失败。

 

接下来是获取数据:

 

1、poll()这个其实是BlockingQueue继承Queue的方法,取走BlockingQueue里排在首位的对象,如果队列是空的返回null。

 

2、poll(long timeout, TimeUnit unit)从BlockingQueue取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败。

 

3、take()检索并删除此队列的头,如有必要则等待,直到某个元素可用为止。

 

4、int drainTo(Collection<? super E> c)一次性从BlockingQueue获取所有可用的数据对象(int drainTo(Collection<? super E> c, int maxElements)还可以指定获取数据的个数),通过该方法,可以提升获取数据效率,不需要多次分批加锁或释放锁。

 

接下来我们来看一下用的多的几个主要阻塞队列,并用代码示例来说明如何使用。

 

1、ArrayBlockingQueue

 

基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数组外,ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

 

 

ArrayBlockingQueue是一个由数组结构组成的有界阻塞队列,我可以从构造方法看到。必须指定数组大小,所有为有界。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。第三个为可以指定在初始化时加入一个集合,基本没用过。 

 

ArrayBlockingQueue在生产者放入数据和消费者获取数据,都是共用同一个锁对象,生产者与消费者无法并行。

 

我们来写一个例子,首先创建一个生产者。

 

 

然后创建一个消费者。

 

 

最后创建一个测试类,来启动两个线程即可。

 

 

2.LinkedBlockingQueue

 

内部也维持着一个链表构成的数据缓冲队列LinkedBlockingQueue不同于ArrayBlockingQueue,它如果不指定容量,默认为Integer.MAX_VALUE,在这里,我们需要注意的是:如果构造一个LinkedBlockingQueue对象,而没有指定其大小,LinkedBlockingQueue会默认为Integer.MAX_VALUE,这样的话,如果生产者的速度大于消费者的速度,也许还没有等队列阻塞产生,系统内存就已经被消耗殆尽了。 

 

同ArrayBlockingQueue不同,生产者端和消费者端分别采用了独立的锁来控制数据同步,内部由两个ReentrantLock来实现出入队列的线程安全,由各自的Condition对象的await和signal来实现等待和唤醒功能。这也意味着在高并发的操作下生产者和消费者可以并行的操作队列中的数据,依次来提高整个队列的并发性能。

 

ArrayBlockingQueue采用的是数组作为数据存储容器,而LinkedBlockingQueue采用的则是以Node节点作为连接对象的链表。 前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的Node对象。

 

来看一下LinkedBlockingQueue的put方法。

 

 

来看一下LinkedBlockingQueue的take方法。

 

 

最后我们来举一个例演示一下LinkedBlockingQueue的使用方法。

 

 

3.DelayQueue

 

DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue是一个没有大小限制的队列,是一个无界的BlockingQueue。

 

因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。

 

DelayQueue用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

 

Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。

 


首先创建一个消息对象继承Delayed,并覆写compareTo与getDelay这两个方法。

 

 

然后我们创建一个消息消费者。

 

 

最后我们来创建一个延时队列,并添加消息,然后执行消费者线程。

 

 

添加两个消息体,id号实际决定运行顺序,1号消息在线程启动后1秒后打印,2号消息在1号打印2秒后打印,总共延时为三秒。

 

我们来看一下打印结果。

 

 

如果将id号颠倒,则三秒后打印world,并马上打印hello,由于hello被阻塞在world后面,且延时时间已到。

 

4. PriorityBlockingQueue

 

   基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定),但需要注意的是PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。因此使用的时候要特别注意,生产者生产数据的速度绝对不能快于消费者消费数据的速度,否则时间一长,会最终耗尽所有的可用堆内存空间。在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁。由上可知是一个无界有序的阻塞队列。

 

        一般使用优先级的队列的场景最常见的就是VIP排队,谁的VIP等级高,谁就排在前面,哪怕是后来进入队列的,这里我们来举一个例子演示一下优先级队列的使用。

 

首先创建一个Customer类,它包括姓名和VIP等级两个属性。

 

 

然后写一个比较客户VIP等级的类VipComparator

 

 

接下来,添加一个生产者队列随机生成客户放入优先级队列中。

 

再添加一个消费者队列,用来处理客户的排队请求。

 

 

最后我们创建一个测试类,在队列中添加10条数据,使用join完成后,开始执行消费者线程处理队列中的内容,看一下是否按照VIP等级顺序执行。

 

 

看一下打印结果:

 

 

VIP等级高的优先执行。

 

5、SynchronousQueue

 

一种无缓冲的等待队列,类似于无中介的直接交易,有点像原始社会中的生产者和消费者,生产者拿着产品去集市销售给产品的最终消费者,而消费者必须亲自去集市找到所要商品的直接生产者,如果一方没有找到合适的目标,那么对不起,大家都在集市等待。相对于有缓冲的BlockingQueue来说,少了一个中间经销商的环节(缓冲区),如果有经销商,生产者直接把产品批发给经销商,而无需在意经销商最终会将这些产品卖给那些消费者,由于经销商可以库存一部分商品,因此相对于直接交易模式,总体来说采用中间经销商的模式会吞吐量高一些(可以批量买卖);但另一方面,又因为经销商的引入,使得产品从生产者到消费者中间增加了额外的交易环节,单个产品的及时响应性能可能会降低。

 

声明一个SynchronousQueue有两种不同的方式,它们之间有着不太一样的行为。公平模式和非公平模式的区别:

 

1、如果采用公平模式:SynchronousQueue会采用公平锁,并配合一个FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略。

 

2、但如果是非公平模式(SynchronousQueue默认):SynchronousQueue采用非公平锁,同时配合一个LIFO队列来管理多余的生产者和消费者,而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。

 

这里写一个Demo来一下如何使用:

 

 

输出结果为:

 

 

SynchronousQueue 内部没有容量,但是由于一个插入操作总是对应一个移除操作,反过来同样需要满足。那么一个元素就不会再SynchronousQueue 里面长时间停留,一旦有了插入线程和移除线程,元素很快就从插入线程移交给移除线程。也就是说这更像是一种信道(管道),资源从一个方向快速传递到另一方 向。显然这是一种快速传递元素的方式,也就是说在这种情况下元素总是以最快的方式从插入着(生产者)传递给移除着(消费者),这在多任务队列中是最快处理任务的方式。在线程池里的一个典型应用是Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了60秒后会被回收。

 

以上就是常用的几种阻塞队列的使用展示及介绍。

 

java高并发之Councurrent详解 最近将自己之前的知识整理整合一遍,防止遗漏忘记。 Concurrent concurrent包是jdk1.5开始所提供的一个针对高并发进行编程的包。 一.阻塞式队列 - BlockingQueue 遵循先进先出(FIFO)原则。阻塞式队列本身使用的时候需要指定界限。 1.ArrayBlockingQueue-阻塞式顺序队列 底层是基于数组来进行储存的,使用时需要指定一个容量,容量在指定之后不可改变。多用于生产-消费模型。 示例代码: public static void main(String[] args 阅读详情

相关推荐

大数据课程C1——ZooKeeper的高并发技术

考虑到锁带来性能开销(锁资源的占用和释放,线程的上下文调度问题),所以在jdk1.8的时候ConcurrentHashMap 采用了无锁算法CAS(Compare And Swap/set-比较和交换),CAS过程一旦被打断就会重新开始,因为CAS涉及到 线程在cpu的调度问题,所以,CAS无锁算法是在cpu的架构上设计实现的。考虑到计算机底层是通过字节的形式来实现数据的存储,在网络传输的时候,本质上也是通过字节的形式传输,所以说 字节的形式用的比较多,重点掌握ByteBuffer。

u013955758的专栏 147

java blockingqueue_Java BlockingQueue take()用法及代码示例

BlockingQueue接口的take()方法用于检索和删除此队列的头。如果队列为空,则它将等待直到元素可用。如果在线程上工作并在该过程中使用BlockingQueue,则此方法效率更高。因此,如果没有可用的元素,则最初调用take()的线程将进入睡眠状态,从而让其他线程执行所需的任何操作。用法:public E take() throws InterruptedException返回值:此方法...

weixin_39956009的博客 2107

EAST算法(Efficient and Accuracy Scene Text))

1.EAST模型简介 本文介绍的文本检测模型EAST,便简化了中间的过程步骤,直接实现端到端文本检测,优雅简洁,检测的准确性和速度都有了进一步的提升。如下图: 其中,(a)、(b)、(c)、(d)是几种常见的文本检测过程,典型的检测过程包括候选框提取、候选框过滤、bouding box回归、候选框合并等阶段,中间过程比较冗长。而(e)即是本文介绍的EAST模型检测过程,从上图可看出,其过程简化为只有FCN阶段(全卷积网络)、NMS阶段(非极大抑制),中间过程大大缩减,而且输出结果支持文本行、单词的多个角度

博客 9579

BlockingQueue深入解析之一DelayQueue

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

qq_41030039的博客 1157

图神经网络实战——利用节点回归预测网络流量

在机器学习中,回归指的是对连续值的预测。通常与分类形成鲜明对比,分类的目标是找到正确的类别(即离散值,而非连续值)。在图数据中,分类和回归分别对应于节点分类和节点回归。在本节中,我们将尝试预测每个节点的连续值,而非分类变量。

盼小辉丶的博客 1万+

电子电气架构 --- 整车电源管理

保证启动能力:防止因电池电量耗尽而导致的车辆无法启动,这对于确保车辆在任何时候都能可靠运行至关重要。 延长电池寿命:通过避免电池深度放电,有助于延长其使用寿命,减少更换电池的需求和成本。 提升用户体验:虽然负载被关闭可能会暂时影响舒适度,但通过在必要时自动采取行动,可以减少驾驶员的焦虑和不确定性,提高整体的用户满意度。

Soly_kun的博客 1084

【Java并发】阻塞队列 BlockingQueue

Java 的阻塞队列(Blocking Queue)是一种特殊的队列,主要用来阻塞队列的插入和获取操作,当队列满了的时候插入操作会被阻塞,直到队列有空位。当队列为空的时候获取操作会被阻塞,直到队列有值。本文对阻塞队列的概念和使用上做了体系化的总结和解析。

hrh的博客 3430

Python 爬虫反爬突破:浏览器指纹深度伪装技术

在当前网络安全与反爬虫技术日趋成熟的环境下,传统的请求头伪装、IP 代理已无法满足复杂站点的爬虫需求。浏览器指纹作为网站识别爬虫、区分真实用户与自动化程序的核心技术,成为爬虫进阶必须突破的关键壁垒。浏览器指纹通过采集浏览器环境、硬件信息、渲染特性等多维数据生成唯一标识,即使更换 IP、清除 Cookie,网站仍可精准识别爬虫程序。本文聚焦浏览器指纹深度伪装技术,从指纹生成原理、核心指纹类型、Python 实现方案、高匿伪装实战到风控绕过策略,全方位讲解浏览器指纹的突破方法。Selenium 官方文档。

2503_91057718的博客 639

10、BlockingQueue阻塞队列

一起学习juc

AldrichEugene 1216

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2099

工业视觉实战:用摄像头+AI高精度测量钢板尺寸(附深度分析)

摘要: 钢铁制造业正加速采用基于摄像头与深度学习的视觉测量技术,以取代传统人工测量,实现钢板长、宽、高(厚)的非接触、高精度在线检测。核心方案包括单目视觉(低成本但受限于变形)、双目/多目立体视觉(可精确测量变形钢板)及3D激光扫描(微米级精度)。系统精度受硬件(相机分辨率、镜头)、算法(亚像素技术)及环境稳定性共同影响,综合精度可达±0.1mm。实战中需重点解决热膨胀(需红外测温实时补偿)和钢板变形(必须采用三维方案)两大挑战,并通过工程化设计(散热、防振)确保系统可靠运行。该技术需融合光学、机械与算法,

数字人生 391

BlockQueue的使用

阻塞队列BlockingQueue的使用

shjniu3000的博客 4521

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。错误信息 kex_exchange_identification: Connection closed by remote host 出现在尝试使用 SSH 连接到远程服务器过程中,表明在密钥交换阶段的一开始,远程主机就关闭了连接。服务器的sshd_config文件中配置错误,可能是不允许的加密算法、修订文件中的语法错误,或者未正确指定用于SSH的HostKey。如果当前已有太多活动连接,新的连接尝试可能会被拒绝。

飞越蓝天的专栏 8297

Java阻塞式线程同步队列BlockingQueue,SynchronousQueue和TransferQueue

Java阻塞式线程同步队列BlockingQueue,SynchronousQueue和TransferQueue BlockingQueue在队列读或取数据时候加锁。生产者向队列添加元素但队列已满时,生产者会被阻塞,反过来,当消费者从队列取出元素但队列为空时,消费者会被阻塞。BlockingQueue(和Queue)是Java 1.5加入的接口类,它是这样一种队列:当生产者向队列添加元素但队...

Zhang Phil 1516

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【多线程案例】阻塞式队列

阻塞式队列的用法和实现

关关的博客 217

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Concurrent包第一部分

** 一、Concurrent概述 **   Concurrent包是jdk5中开始提供的一套并发编程包,其中包含了大量和多线程开发相关的工具类,大大的简化了java的多线程开发,在高并发及分布式场景下应用广泛。Concurrent是java.util下的包。 二、BlockingQueue 阻塞式队列 1、概述   阻塞式队列是一种队列数据结构,和其他队列比起来,多了阻塞机制,从而可以在多个线程...

hongye301的博客 538

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

冷脸萌萌的技术实践 4112

java中queue排序_一文弄懂java中的Queue家族

简介java中Collection集合有三大家族List,Set和Queue。当然Map也算是一种集合类,但Map并不继承Collection接口。List,Set在我们的工作中会经常使用,通常用来存储结果数据,而Queue由于它的特殊性,通常用在生产者消费者模式中。现在很火的消息中间件比如:Rabbit MQ等都是Queue这种数据结构的展开。今天这篇文章将带大家进入Queue家族。Queue接...

weixin_29734123的博客 1033

深入浅出BlockingQueue(一)

BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。最常见的"生产者-消费者"问题中,队列通常被视作线程间的数据容器,生产者将“生产”出来的数据放入数据容器,消费者从“数据容器”中获取数据,这样,生产者线程和消费者线程就解耦了,各自只需要专注自己的业务即可。),然后通知被阻塞的消费者线程:当前队列中有数据可供消费(

2302_79432188的博客 907

java队列

面试题: 说一些线程安全的集合类: HashTable ConcurrentHashMap CopyOnWriteArrayList Vector(List的前身) 集合相关面试题 考点:在对集合进行遍历过程中,想删除集合中的元素,只能使用迭代器的删除方法,若在迭代过程中,使用集合的删除方法,会抛出并发修改异常 笔试题:编程题 1. 对一个list集合去重 eg:list: tom amy jack tom amy rose ...

gulanga5的博客 534

并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理...

·  在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列。另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas算法来保证线程安全的,接下来就让我们来看一下jdk中两种队列的实现方式。 1. ConcurrentLinkedQueue的实现原理   顾名思义,这是一个基于链表结构的队列,它是一个...

aihuzhu8250的博客 72

使用阻塞式队列处理大数据

转自:http://blog.youkuaiyun.com/lifetragedy/article/details/50593588 前言 我们都知道,JAVA对于文本文件在读时是独占的,即使可以用多线程去读也涉及到一个POS(定位读)的问题,这在设计框架上会带来许多的复杂性,同时也带来代码上的不可维护性以及会经常出一些千奇百怪的错误(多线程程序由其如此)。 传统阻塞式做法的敝病

codershamo的博客 3979

队列--java

Java队列分成两种: 1.并发队列ConcurrentLinkedQueue(非阻塞式) BlockingQueue(阻塞式) 2.阻塞式和非阻塞式区别: 1.入列,出列 阻塞式 入列(存队列)阻塞式队列,如果超出队列总数(10个队列),这时候会进行等待(阻塞); 出列 (获取队列),如果获取队列为空的情况下,这时候也会进行等待(阻塞); 队列:主要遵循先进先出,后进后出。 ...

weixin_41872192的博客 194
上一篇: Java 并发编程 ThreadLocal
下一篇: Java 线程池
JavaBoy王皓
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值