实战completionService遇到的困惑
来源:6-2 J.U.C之AQS-CountDownLatch

搬砖战士
2018-09-05
遇到一个困难的问题, 不知道是不是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回答
-
你好,贴一下你这里的核心代码看看
012018-09-05 -
Jimin
2018-09-05
Future<V> take() throws InterruptedException
获取并移除已完成状态的task,如果目前不存在这样的task,则等待;Future<V> poll()
获取并移除已完成状态的task,如果目前不存在这样的task,返回null;我认为你这里确实应该使用take,当时如果没拿到,要一直等待到拿到,然后再调用get()
00 -
搬砖战士
提问者
2018-09-05
慕课好像会降低图片像素, 不知道够不够清晰。
第一张图 是callable中的代码, try里面执行业务逻辑, finally里面执行countDown()
第二张图是callable的manager类, 第一步是准备参数, 第二步submit, 第三步await, 第四步获取结果
自测下来, 如果try里面的逻辑执行地非常快, 就有机会出现poll()到null的情况
00
相似问题