请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

实战completionService遇到的困惑

遇到一个困难的问题, 不知道是不是countDownLatch失效了。 

使用completionService+ countDownLatch的组合, 在await()之后对service进行poll, 但是居然没有返回future而是返回null。 在poll的时候加上50毫秒的等待时间后, 就不出这个问题了。 真奇怪, future里面的业务逻辑我是放在try里面的, countDown是放在finally里面的, 照理说latch的await()能过, 后面对service的poll()应该是不用加等待时间也不会返回null才对。 想不明白, 只能猜测是finally执行完countDown以后, future的状态转换以及done()还需要一些时间。 所以现在很困惑, 应该poll(), poll(timewait), take()中哪一种方法去获取执行结果才是合理的呢。

正在回答

3回答

Jimin 2018-09-05 19:02:54

你好,贴一下你这里的核心代码看看

0 回复 有任何疑惑可以回复我~
  • 提问者 搬砖战士 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-09-05 19:40:08
Jimin 2018-09-05 23:04:02

Future<V> take() throws InterruptedException
获取并移除已完成状态的task,如果目前不存在这样的task,则等待;

Future<V> poll()
获取并移除已完成状态的task,如果目前不存在这样的task,返回null;

我认为你这里确实应该使用take,当时如果没拿到,要一直等待到拿到,然后再调用get()


0 回复 有任何疑惑可以回复我~
提问者 搬砖战士 2018-09-05 19:12:54

慕课好像会降低图片像素, 不知道够不够清晰。

第一张图 是callable中的代码,  try里面执行业务逻辑, finally里面执行countDown()

https://img1.sycdn.imooc.com//szimg/5b8fb94f00010c9b13520392.jpg

第二张图是callable的manager类, 第一步是准备参数, 第二步submit, 第三步await, 第四步获取结果

https://img1.sycdn.imooc.com//szimg/5b8fb9500001998f19180724.jpg

自测下来, 如果try里面的逻辑执行地非常快, 就有机会出现poll()到null的情况 

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信