我在情况下,我有对象的集合,每个对象都有运行昂贵的方法,它采用约5-10秒钟即可完成。
我怎么可以运行在所有的方法并行,并定期检查其状态?
我试图用@Async注释与未来的响应,但什么都没有改变。
public static void populate(String marketId) {
//irrelevant code removed
List<Company> companies = mongo().find(new Query(c), Company.class);
List<Future> futures = new ArrayList<Future>();
for(Company comp : companies) {
futures.add(comp.updateData(market));
}
}
@Async
public Future<Boolean> updateData(Market market) {
//do my slow logic here
return new AsyncResult(false);
}
是ThreadPoolTaskExecutor类要走的路?
我有点困惑,你使用AsyncResult的原因(和实施... EJB?)。 如果我没有记错的话,它不会按照这种方式,因为(据我所知)AsyncResult连接到豆和@Asyncronous注释使得从一个特定的bean方法assyncronous响应。 但是,如果一个对象内部使用,这将是有效的顺序。
你所需要的就是一个正常的未来。 如果是这样,你需要在实际的执行中运行这些期货不是等到他们完成调用的Future.get()。 一个很好的教程,你可以在这里找到: http://java.dzone.com/articles/javautilconcurrentfuture
您还可以查看到阿卡。 演员模型是我个人最喜欢的,你可以简单地催生一群工人,告诉他们做什么,并让他们让你知道一旦他们有自己的工作做好。 不过这可能是矫枉过正,如果你只在手上有一个简单的任务,取决于你的风格。
ExecutorService pool = Executors.newFixedThreadPool(10);
public static void populate(String marketId) {
//irrelevant code removed
List<Company> companies = mongo().find(new Query(c), Company.class);
List<Future> futures = new ArrayList<Future>();
for(Company comp : companies) {
futures.add(comp.updateData(market));
}
for(Future future: futures) {
future.get()
}
}
public Future<Boolean> updateData(Market market) {
return pool.submit(new Callable<Boolean>() {
@Override
public Void call() throws Exception {
//do your slow stuff here;
return false;
}
})
}
原因这是有道理的,如果你需要从这些未来一些实际的回报。 如果他们是无效的,而且你只需要一个线程到别的地方运行一些副作用,不是没有一点做这样的说法,你可以简单地使用可运行和执行者。 类似这样的东西: 等到所有线程完成在Java工作