线程池异步并行执行有一个小缺陷

    image.png

    CompletionService 接口的实现类是 ExecutorCompletionService,这个实现类的构造方法有两个,分别是:

    1. ExecutorCompletionService(Executor executor)
    2. ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)

    这两个构造方法都需要传入一个线程池,如果不指定 completionQueue,那么默认会使用无界的 LinkedBlockingQueue。任务执行结果的 Future 对象就是加入到 completionQueue 中

    1. Future<V> submit(Callable<V> task);//执行异步任务,有返回值
    2. Future<V> submit(Runnable task, V result);//执行异步任务,没有返回值
    3. Future<V> take() throws InterruptedException;//如果队列是空的,会阻塞等待
    4. Future<V> poll();//如果队列是空的,会返回null
    5. Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;//带有等待时间

    image.png