春天并行执行的方法(Spring Parallel Execution Of A Method)

2019-10-21 12:31发布

我在情况下,我有对象的集合,每个对象都有运行昂贵的方法,它采用约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);

}

ThreadPoolTask​​Executor类要走的路?

Answer 1:

我有点困惑,你使用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工作



文章来源: Spring Parallel Execution Of A Method