我正在尝试在 grails 中使用 executor 插件,但我遇到了一个我无法解决的问题。基本上,我有一个我想要抓取的链接列表,我遇到了一个问题,它总是抓取相同的链接,所以我将我的示例简化为:
List offerLinks = getOfferLinks(parser)
offerLinks.each{println it}
List futures = new Vector()
for (def link : offerLinks) {
def future = callAsync {
return link
}
futures.add(future)
}
futures.each{println "FUTURE " + it.get()}
这是在控制台中打印的内容
bt-ofrd-acciona-6633344.htm?
bt-ofrd-celiasiffredi-293068.htm?
bt-ofrd-clahubiz-92924.htm?
bt-ofrd-haruko-1672632.htm?
未来的 bt-ofrd-clahubiz-92924.htm?
未来的 bt-ofrd-haruko-1672632.htm?
未来的 bt-ofrd-haruko-1672632.htm?
未来的 bt-ofrd-haruko-1672632.htm?
前 4 个结果用于offerLinks.each{println it}
代码
最后 4 个用于futures.each{println "FUTURE " + it.get()}
我试图找出的是为什么将这些链接放在 callAsync 块中并从未来对象中检索它们会使它们获取最后一个值,似乎它替换了已经创建的未来对象?
这段代码位于控制器调用的服务中。我很感激你能给我的任何帮助。谢谢
更新:
我认为 Java 执行程序 API 中存在某种问题......或者我不完全理解它是如何工作的?
这是另一个将代码更改为使用 invokeAll 的测试:
def threadPool = Executors.newCachedThreadPool()
List offerLinks = getOfferLinks(parser)
List lista = new ArrayList()
for (enlace in offerLinks) {
println "link " + enlace
lista.add({enlace} as Callable)
}
def futures = threadPool.invokeAll(lista)
futures.each{println "FUTURE " + it.get()}
这是打印
链接/bt-ofrd-implementar-192996.htm 的内容吗?
链接/bt-ofrd-cdonini-864908.htm?
链接/bt-ofrd-hvtalent-1493932.htm?
链接/bt-ofrd-dbak-1358120.htm?
链接/bt-ofrd-hexacta-100072.htm?
链接/bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?
未来 /bt-ofrd-ccibelli-457472.htm?