【问题标题】:Parallel for with Spring Asynchronous execution与 Spring 异步执行并行
【发布时间】:2016-07-11 13:42:17
【问题描述】:

我想遍历元素列表并异步(以并行方式)对它们执行操作。

这是我的代码:

@Autowired
ElemManager elemManager;

... 
List<Elem> elems = new ArrayList<>();

for ( Elem elem : elems ) {
     System.out.println(elemManager.doSomething(elem).get());
}

ElemManager 在哪里:

public class ElemManager {

  @Async
  public Future<String> doSomething( Elem elem ) {
    // do something
    return "done";
}

我还在 spring 上下文中创建了一个线程池并启用了异步执行,所以:

@Configuration
@EnableAsync
public class TaskConfiguration implements AsyncConfigurer {

  @Override
  public Executor getAsyncExecutor() {
    final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    threadPoolTaskExecutor.setMaxPoolSize( 5 );
    threadPoolTaskExecutor.setAwaitTerminationSeconds( 60 );
    threadPoolTaskExecutor.initialize();
    return threadPoolTaskExecutor;
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new CustomAsyncExceptionHandler();
  }

}

我错过了什么吗?通过Spring异步执行支持并行执行方法是否正确?

【问题讨论】:

  • 您能告诉我们您是如何启用异步执行的吗?

标签: java spring multithreading


【解决方案1】:

您实际上并没有使用 Spring 调用它。你只是像一个普通的旧方法一样调用它。

但除此之外,调用Future.get() 意味着您等待未来完成。

先将Futures 添加到列表中,然后依次调用.get()

List<Future<?>> futures = new ArrayList<>();
for ( Elem elem : elems ) {
  futures.add(elemManager.doSomething(elem));
}
for (Future<?> future : futures) {
  System.out.println(future.get());
}

【讨论】:

  • 我怀疑这一点。非常感谢您的支持!
  • 如果我使用futures.parallelStream().forEach(futures -&gt; System.out.println(future.get());)。可行吗?
  • 我很抱歉。我没有放@Autowired。显然,在我的应用程序中 elemManager 是一个 Spring bean,我认为将在 TaskExecutor 配置中初始化的执行程序注入其中。
【解决方案2】:

为什么不使用 Java 8 并行流功能?详情见这里:https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

【讨论】:

  • 我想试一试,但我读到过类似的文章dzone.com/articles/think-twice-using-java-8
  • 在那篇文章中说:“只有两种选择如何确保这种事情永远不会发生。第一个是确保所有提交到公共 fork-join 池的任务不会卡住了,会在合理的时间内完成。”他们似乎提出了一个潜在的情况,但对你来说可能不是这样。我会试一试,看看是否有任何缺点。
【解决方案3】:

您能否尝试将执行程序名称作为属性添加到@Async。 更多详情请参考this link

【讨论】:

  • 我已经在使用您建议的链接第 4.2 点的配置。谢谢
猜你喜欢
  • 2012-11-07
  • 2018-08-18
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2014-06-12
相关资源
最近更新 更多