}
方法简介如下:
* 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 {