java CompletionService在线程执行器中分离任务的启动与结果的处理

是什么?为什么?怎么做?

 

一、是什么

CompletionService是java.util.concurrent包提供的一个接口,用来获取线程异步执行的结果。

二、为什么

1.CompletionService的使用

请参照:

java CompletionService获取线程异步执行的结果

2.分离任务的执行和结果的处理

往往会有这样的情景:

在一个对象中提交任务,在另外一个对象中对任务执行的结果进行处理。

我个人认为这个场景就是生产者消费者模式,一个对象专门提交任务(生产任务对象),而另一个对象专门消费任务对象(对任务对象进行处理)。

如果使用Future实现,首先需要在一个对象中提交任务给线程执行器,获取Future对象,并将其放入一个集合中。然后另一个对象不停地从集合中获取任务,检查任务是否完成。如果任务完成了,对结果进行处理,移除任务。如果任务未完成,暂时跳过当前任务,检查下一个任务是否完成。

这个解决方案有两个要点:

1.需要生产(获取)、保存(在这里使用了一个list)、消费(操作之后移除)Future对象。

2.需要检查任务是否完成(换言之,就是要获取成功执行的任务,跳过未执行完/执行失败的任务)。

如果每次都是用Future去实现,比较复杂,使用CompletionService会更加理想。CompletionService提供了submit方法,可以把任务提交给线程执行器,提供了take方法,获取最新的执行完毕的Future对象。使用同一个CompletionService对象,就可以在不同对象中进行任务的提交和获取(但是CompletionService依然有缺陷。take方法获取的全部都是已经执行完毕的任务,只能用于获取结果)。

三、怎么做

运行结果:

通过CompletionService,实现了在一个对象中提交任务,在另一个对象处理结果的情景(分离任务的启动与结果的处理)。

四、总结

要体会到CompletionService的优势。

发表评论

电子邮件地址不会被公开。 必填项已用*标注