线程池异步并行执行有一个小缺陷
CompletionService 接口的实现类是 ExecutorCompletionService,这个实现类的构造方法有两个,分别是:
ExecutorCompletionService(Executor executor)
;ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
。
这两个构造方法都需要传入一个线程池,如果不指定 completionQueue,那么默认会使用无界的 LinkedBlockingQueue。任务执行结果的 Future 对象就是加入到 completionQueue 中
Future<V> submit(Callable<V> task);//执行异步任务,有返回值
Future<V> submit(Runnable task, V result);//执行异步任务,没有返回值
Future<V> take() throws InterruptedException;//如果队列是空的,会阻塞等待
Future<V> poll();//如果队列是空的,会返回null
Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;//带有等待时间