脚本宝典收集整理的这篇文章主要介绍了探秘高并发之java.util.concurrent(一),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
大家好,最近由于公司的事情不是很多,准备开篇写一写concurrent这一块,因为最近好多面试者对这个都不是很了解,有的是知其然不知其所以然,我写这篇(系列)文章的初衷是为了总结和归纳这一块,如果本文能够对大家带来一定的帮助,那么一定是我莫大的荣耀,好了,话不多说我们开始探秘concurrent吧。
首先从字面意思我们能理解到concurrent是“同时发生的”,在java中自然是用来做并发使用的,这个concurrent 包是java5才提出的,然而经过几个版本的更迭,目前已经是大家都会深入用到,或者是多少会接触到的,其实在java中已经有Thread
,Runnable
等多线程的实现;我们为什么要用到concurrent包来做呢?下面我将带大家一步一步的了解。
针对高质量Java多线程并发程序设计时,为防死崩等现象的出现,比如使用java之前的wait()
、notify()
和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担。为了减少甚至是去除咱们这种后顾之忧, Doug Lea为大家推出了这个解决方案,让众多java开发者如沐春风。
在java8中concurrent一共有21个接口、38个类其中包括抽象类和内部类、1个枚举类、6种异常方式,当然这个数字都不重要,大家在看api的时候只会找自己关注的部分。
1. BlockingDeque
BlockingDeque继承自BlockingQueue和 Deque ;BlockingQueue也是java.util.concurrent
包下面的一个接口,而Deque则属于java.util
。
来自官方的一段说明是,该接口定义了在deque两端访问元素的方法。提供了插入、删除和检查元素的方法。这些方法中的每个存在两种形式:一个抛出一个异常,如果操作失败,另一个返回一个特殊的值(无论是null或false,取决于操作)。插入操作的后一种形式是专为使用有容量限制deque实现;在大多数实现中,插入操作不会失败。
这个队列的特性其实是保证了先进先出的原则,与列表接口不同,此接口不提供对元素索引访问的支持。在实现中Deque不强制禁止空值,但是不推荐这样去做。
2. BlockingQueue
这个接口和上面一个长得有点像,但不要混淆了,干妹妹和干妹妹还不是一个意思呢(好污...)。BlockingQueue是用来对不同操作进行不同处理的(你这不是废话么...)BlockingQueue一共有四种处理形式,分别为 Throws exception、 SPEcial value、 Blocks
(不是打篮球的盖帽)、 Times out
;其实核心意思就是不满足的就抛出异常、根据操作返回一个特定值true或false、让当前线程执行到成功为止,最后就是设定一个超时时间,以免第三步一直不成功。
下面是官方给出的一个例子,大家可以感受下:
class PRoducer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class SETUP { void main() { BlockingQueue q = new SomeQueueimplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
好啦,本篇文章就先到这里了,我们后面会继续讲这个神奇的concurrent包,大家有兴趣的话可以关注一下本文。
以上是脚本宝典为你收集整理的探秘高并发之java.util.concurrent(一)全部内容,希望文章能够帮你解决探秘高并发之java.util.concurrent(一)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。