欢迎来到天天文库
浏览记录
ID:29849549
大小:20.46 KB
页数:14页
时间:2018-12-24
《java多线程总结之线程安全队列queue》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划java多线程总结之线程安全队列queue 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要
2、明确。线程安全的类,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的。如果由于多线程的访问而使这些变量结构被破坏或者针对这些变量操作的原子性被破坏,则这个类就不是线程安全的。 今天就聊聊这两种Queue,本文分为以下两个部分,用分割线分开:? ?BlockingQueue阻塞算法ConcurrentLinkedQueue,非阻塞算法 首先来看看BlockingQueue:Queue是什么就不需要多说了吧,一句话:队列是先进先出。相对的,栈是后进先出。如果不熟悉的话先找本基础的数据结构的书看看
3、吧。 BlockingQueue,顾名思义,“阻塞队列”:可以提供阻塞功能的队列。首先,看看BlockingQueue提供的常用方法:目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 从上表可以很明显看出每个方法的作用,这个不用多说。我想说的是:? add(e)remove()element()方法不会阻塞线程。当不
4、满足约束条件 时,会抛出IllegalStateException异常。例如:当队列被元素填满后,再调用add(e),则会抛出异常。 ?offer(e)poll()peek()方法即不会阻塞线程,也不会抛出异常。例如:当队列被元素填满后,再调用offer(e),则不会插入元素,函数返回false。?要想要实现阻塞功能,需要调用put(e)take()方法。当不满足约束条件时,会阻塞线程。 好,上点源码你就更明白了。以ArrayBlockingQueue类为例: 对于第一类方法,很明显如果操作不成功就抛
5、异常。而且可以看到其实调用的是第二类的方法,为什么?因为第二类方法返回boolean啊。 Java代码 1.publicbooleanadd(Ee){ 2.if(offer(e)) 3.returntrue; 4.else目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 5.thrownewIllegalSta
6、teException("Queuefull");//队列已满,抛异常 6.} 7. 8.publicEremove(){ 9.Ex=poll(); 10.if(x!=null) 11.returnx; 12.else 13.thrownewNoSuchElementException();//队列为空,抛异常 14.} 对于第二类方法,很标准的ReentrantLock使用方式,另外对于insert和extract的实现没啥好说的。 注:先不看阻塞与否,这ReentrantLock的使
7、用方式就能说明这个类是线程安全类。 Java代码 1.publicbooleanoffer(Ee){ 2.if(e==null)thrownewNullPointerException(); 3.finalReentrantLocklock=; 4.(); 5.try{ 6.if(count==)//队列已满,返回false目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的
8、正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 7.returnfalse; 8.else{ 9.insert(e);//insert方法中发出了(); 10.returntrue; 11.} 12.}finally{ 13.(); 14.} 15.} 16. 17.publicEpoll(){ 18.finalReentrantLocklock=; 19
此文档下载收益归作者所有