Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与Spring异步执行并行_Java_Spring_Multithreading - Fatal编程技术网

Java 与Spring异步执行并行

Java 与Spring异步执行并行,java,spring,multithreading,Java,Spring,Multithreading,我希望迭代元素列表,并异步(以并行方式)对其执行操作 这是我的密码: @Autowired ElemManager elemManager; ... List<Elem> elems = new ArrayList<>(); for ( Elem elem : elems ) { System.out.println(elemManager.doSomething(elem).get()); } 我错过什么了吗?这是通过Spring异步执行支持并行执行方

我希望迭代元素列表,并异步(以并行方式)对其执行操作

这是我的密码:

@Autowired
ElemManager elemManager;

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

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

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

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

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

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

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

List为什么不使用Java8并行流功能?有关详细信息,请参见此处:

能否尝试在@Async中添加执行器名称作为属性。
有关更多详细信息,请参阅

能否告诉我们您是如何启用异步执行的?我怀疑这一点。非常感谢您的支持!如果我使用了
futures.parallelStream().forEach(futures->System.out.println(future.get());)
。这可行吗?我道歉。我没有把
@Autowired
。显然,在我的应用程序中,
elemManager
是一个Springbean,我认为它将被注入
TaskExecutor
配置中初始化的执行器。我想尝试一下,但我在那篇文章中读到了类似的文章,它说:“只有两种选择可以确保这样的事情永远不会发生。第一个是确保提交到公共fork-join池的所有任务不会被卡住,并在合理的时间内完成。“似乎他们提出了一个潜在的情况,这可能不是你的情况。我会尝试一下,看看是否有任何缺点出现。我已经在使用类似于您建议的链接第4.2点的配置。谢谢
@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();
  }

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