Callable的Future模式

继承Thread;

实现Runnable接口。

通过wait、notify、notifyAll并结合状态变量等来进行并发设计

调用callable实现示例

 

结果

 

 

 Future概念

 

allAsList:对多个ListenableFuture的合并,返回一个当所有Future成功时返回多个Future返回值组成的List对象。注:当其中一个Future失败或者取消的时候,将会进入失败或者取消。

successfulAsList:和allAsList相似,唯一差别是对于失败或取消的Future返回值用null代替。不会进入失败或者取消流程。

immediateFuture/immediateCancelledFuture: 立即返回一个待返回值的ListenableFuture。

主要接口为ListenableFuture,并借助于Futures静态扩展。

继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。

对ListenableFuture添加回调函数:

Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)

Future的示例

 

 

Future源码

 

 

 并发队列queue

 

队列其实就是一个容器
1.同步容器
Vector容器,HashTable容器,都是线程安全
如果同步容器使用foreach迭代过程中修改了元素的值,则会出现ConcurrentModificationException异常
可以使用iterator迭代器解决,但是在多线程并行情况下,修改容器中数据,会发生阻塞或者报NoSech异常
1.并发容器,队列
无界限:代表队列当中可以存放N个数据,没有长度限制
有界限:队列当中规定只能存放多少个数据,超过则阻塞

2.ConcurrentLinkedQueue,无界限的队列,可以采用add()方法(底层调用offer())或者offer方法将数据存放到队列当中,通过peek和poll方法获取队列头数据
peek()方法获取数据,但是该数据没有出列
poll()方法获取数据,完成后该数据出列

peek和poll当队列当中没有数据时,获取的数据为null,不会产生阻塞

 

 ConcurrentLinkedQueue 

ConcurrentLinkedQueue,无界限的队列,可以采用add()方法(底层调用offer())或者offer方法将数据存放到队列当中,通过peek和poll方法获取队列头数据
    peek()方法获取数据,但是该数据没有出列
    poll()方法获取数据,完成后该数据出列
    peek和poll当队列当中没有数据时,获取的数据为null,不会产生阻

 

BlockingQueue

BlockingQueue即阻塞队列,它算是一种将ReentrantLock用得非常精彩的一种表现,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,

 

 

 BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的区别主要体现在存储结构上或对元素操作上的不同,但是对于take与put操作的原理,

 

 

LinkedBlockingQueue是一个基于已链接节点的,范围任意的blocking queue
此队列按FIFO先进先出排序元素
新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素
链接队列的吞吐量通常要高于基于数组的对列,但是在大多数并发应用程序中,其可预知的性能要低
可选的容量范围构造方法参数作为防止队列过度扩展的一种方法,如果未指定容量,则等于Integer.MAX_VALUE,除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点

 

posted on 2020-03-23 18:01  我胡闹i你善后i  阅读(278)  评论(0编辑  收藏  举报