前言:
ExecutorService并不是按照submit(Callable/Runnable)的顺序来完成任务的(ExecutorService内部有一个List来维护任务队列),每submit一次返回的Future对象所对应的任务不一定是完成的。所以,当你按照顺序submit任务并按照顺序将返回的Future加入到一个List中,并遍历这个List去调用每个Future的get()方法时会被阻塞。CompletionService很好的解决了这个问题。
原理:
CompletionService会将Executor执行任务的返回结果Future加入到BlockingQueue,它的take()会不断地从BlockingQueue中取Future,如果该队列为空,take()方法会发生阻塞。CompletionService很好地将完成任务并返回Future结果和对结果的处理进行了分离。
注:类似于生产者和消费者的关系。
构造方法:
- ExecutorCompletionService(Executor )
- ExecutorCompletionService(Executor ,BlockingQueue )
常用方法:
- umbit():提交任务,Executor去执行该任务
- take():从阻塞队列中取执行结果即Future对象
- poll():该方法与take类似,只是不会等待,如果没有满足要求,就返回null
- poll(long , TimeUnit ):设置等待时间
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18