我有一个解析器,在收集一行数据后,我想触发一个 aync 函数并让它处理该行,同时主线程继续运行并获取下一行。
我看过这个帖子:在 Groovy 中如何同时执行两个任务并等待结果? https://stackoverflow.com/questions/11529521/how-do-i-execute-two-tasks-simultaneously-and-wait-for-the-results-in-groovy?rq=1但我不确定这是否是适合我的情况的最佳解决方案。
我想要做的是,读取所有行后,等待所有异步函数完成,然后再继续。使用 Promise 集合的一个问题是该列表可能很大(100,000+)。
另外,我想随时报告状态。最后,我不确定我是否想要自动等待超时(例如在 get() 上),因为文件可能很大,但是,我确实希望允许用户出于各种原因终止进程。
所以我现在所做的是记录解析的行数(因为它们通过rowsRead),然后使用 Promise 中的回调来记录正在完成处理的另一行,如下所示:
def promise = processRow(row)
promise.whenBound {
rowsProcessed.incrementAndGet()
}
Where 已处理行数是一个原子整数。
然后,在工作表末尾调用的代码中,在完成所有解析并且等待处理完成后,我将执行以下操作:
boolean test = true
while (test) {
Thread.sleep(1000) // No need to pound the CPU with this check
println "read: ${sheet.rowsRead}, processed: ${sheet.rowsProcessed.get()}"
if (sheet.rowsProcessed.get() == sheet.rowsRead) {
test = false
}
}
令人高兴的是,我这里没有大量的 Promise 对象 - 只是一个简单的计数来检查。但我不确定经常睡觉是否与检查每个 Promise() 对象上的 get() 一样有效。
所以,我的问题是:
- 如果我使用 Promises 集合,如果执行上面 while 循环的线程被 Thread.interrupt() 中断, get() 会做出反应并返回吗?
- 使用 Promise 集合并对每个 Promise 调用 get() 会比尝试睡眠和经常检查更有效吗?
- 还有其他我没有考虑过的更好的方法吗?
Thanks!