我的设置如上所述。我想要实现的是在我的每个实现的类中都有aMethod并行运行。我已经研究过使用Future
和Runnable
,我不确定如何继续这两个过程。
我的第一个想法是尝试返回Future<Boolean>
而不是常规boolean
,但我不确定如何将结果与最初调用的名称相关联。
我希望aMethod并行/异步运行的原因是因为aMethod可能有一个http请求。如果有请求,我不想等待回复继续。我希望它在一个单独的线程中执行此操作并继续下一个方法。
有很多http请求,aClass.doMethod()需要一段时间才能完成。我想并行运行它们,所以在继续之前我不必等待每个http请求。
任何人都有关于如何做到这一点的提示?
import java.util.ArrayList;
import java.util.List;
//Strategy.java
public interface Strategy {
boolean aMethod();
}
//AStrategy.java
public class AStrategy implements Strategy {
@Override
public boolean aMethod() {
// Do a couple http requests
return true;
}
}
//BStrategy.java
public class BStrategy implements Strategy {
@Override
public boolean aMethod() {
// Do some other requests
return true;
}
}
//SomeClass.java
public class SomeClass {
String name;
Strategy aStrategy;
public SomeClass(String name, Strategy strategy) {
this.name = name;
this.aStrategy = strategy;
}
public boolean doMethod() {
return aStrategy.aMethod();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//Just a regular pojo
//ResultsClass.java
public class ResultsClass {
String name;
boolean result;
public ResultsClass(String name, boolean result) {
this.name = name;
this.result = result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isResult() {
return result;
}
public void setResult(boolean result) {
this.result = result;
}
}
public class AClass {
public static void main(String args[]) {
List<SomeClass> classes = new ArrayList<>();
classes.add(new SomeClass("Class 1", new AStrategy()));
classes.add(new SomeClass("Class 2", new BStrategy()));
List<ResultsClass> results = new ArrayList<>();
classes.forEach(aClass -> results.add(new ResultsClass(aClass.getName(), aClass.doMethod())));
}
}
答案 0 :(得分:1)
最简单的方法是使用ThreadPoolExecutor
,使策略类可运行或将它们包装在runnables中,然后将它们提交给执行程序。一旦提交完毕,您就可以阻止期货直到线程完成,您可以从期货中检索结果。