【Java多线程-4】CompletionService详解

}




方法简介如下:



*   submit(Callable task):提交线程任务,交由 Executor 对象去执行,并将结果放入阻塞队列;

*   take():在阻塞队列中获取并移除一个元素,该方法是阻塞的,即获取不到的话线程会一直阻塞;

*   poll():在阻塞队列中获取并移除一个元素,该方法是非阻塞的,获取不到即返回 null ;

*   poll(long timeout, TimeUnit unit):从阻塞队列中非阻塞地获取并移除一个元素,在设置的超时时间内获取不到即返回 null ;



接下来,我们重点看一下submit 的源码:



public Future submit(Callable task) {

if (task == null) throw new NullPointerException();

RunnableFuture<V> f = newTaskFor(task);

executor.execute(new QueueingFuture(f));

return f;

}




从submit 方法的源码中可以确认两点:



1.  线程任务确实是由 Executor 对象执行的;

2.  提交某个任务时,该任务首先将被包装为一个QueueingFuture。



继续追查 QueueingFuture,可以发现:  

该类重写了 FutureTask 的done方法,当计算完成时,把Executor执行的计算结果放入BlockingQueue中,而放入结果是按任务完成顺序来进行的,即先完成的任务先放入阻塞队列。



/**

  • FutureTask extension to enqueue upon completion

*/

private class QueueingFuture extends FutureTask {


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值