实战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回答

Jimin

2018-09-05

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

0
1
搬砖战士
非常感谢!
2018-09-05
共1条回复

Jimin

2018-09-05

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

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

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


0
0

搬砖战士

提问者

2018-09-05

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

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

//img.mukewang.com/szimg/5b8fb94f00010c9b13520392.jpg

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

//img.mukewang.com/szimg/5b8fb9500001998f19180724.jpg

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

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程