尝试以vertx方式处理长时间运行的作业列表
人们希望有人可以这样做:
我知道这种方法不起作用..在代码落入CompositeFuture之前,Futures列表尚未完成。
是否有executeBlocking方法或是否必须使用支持列表的eventbus,vertx utils?
java.util.ArrayList futureList = new ArrayList()
for (i = 0; i < 100; i ++){
vertx.executeBlocking({ future ->
int id = i
println "Running " + id
java.lang.Thread.sleep(1000)
println "Thread done " + id
future.complete()
}, true , { res ->
if (res.succeeded()) {
print "."
} else {
print "x"
}
})
}
CompositeFuture.join(futureList).setHandler({ ar ->
if (ar.succeeded()) {
System.err.println "all threads should be done.."
}
})
结果...&#34;所有线程都应该完成&#34;早期印刷
Running 84
Running 87
Running 87
Running 95
all threads should be done..
done.
Thread done 3
Thread done 36
Thread done 3
线程完成0
答案 0 :(得分:1)
在您的示例中,futureList
为空,因此CompositeFuture.join(futureList)
会立即完成。
像这样更改你的例子:
java.util.ArrayList futureList = new ArrayList()
for (i = 0; i < 100; i ++){
Future jobFuture = Future.future()
futureList.add(jobFuture)
vertx.executeBlocking({ future ->
int id = i
println "Running " + id
java.lang.Thread.sleep(1000)
println "Thread done " + id
future.complete()
}, true , { res ->
if (res.succeeded()) {
print "."
} else {
print "x"
}
jobFuture.complete()
})
}
注意jobFuture
创建:
Future jobFuture = Future.future()
futureList.add(jobFuture)
以及完成:
jobFuture.complete()
现在只有在所有作业完成后才会执行CompositeFuture.join(futureList)
处理程序。