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());
}