java中CompletableFuture实现业务串行和并组合执行
参考
JDK1.8新特性CompletableFuture总结
JDK8新特性之CompletableFuture详解
截图
代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
public class FutureTest {
public static void main(String[] args) {
// A ┐ ┌ D ┐
// ├→ C ┤ ├→ R
// B ┘ └ E ┘
System.out.println("start");
CompletableFuture<A> fa = CompletableFuture.supplyAsync(FutureTest::doA);
CompletableFuture<B> fb = CompletableFuture.supplyAsync(FutureTest::doB);
CompletableFuture.allOf(fa,fb);
C c = doC(fa.join(), fb.join());
CompletableFuture<D> fd = CompletableFuture.supplyAsync(() -> doD(c));
CompletableFuture<E> fe = CompletableFuture.supplyAsync(() -> doE(c));
System.out.println(res(fd.join(),fe.join()));
System.out.println("end");
}
public static A doA(){
return doForSleep("doA",new A()).name("A");
}
public static B doB(){
return doForSleep("doB",new B()).name("B");
}
public static C doC(A a,B b){
return doForSleep("doC",new C()).name(a.name + b.name + "=C");
}
public static D doD(C c){
return doForSleep("doD",new D()).name("["+c.name+"]&D");
}
public static E doE(C c){
return doForSleep("doE",new E()).name("["+c.name+"]^E");
}
public static String res(D d,E e){
return doForSleep("res","res={"+d.name+"}|{"+e.name+"}");
}
public static <T> T doForSleep(String type,T t){
try {
int n = ThreadLocalRandom.current().nextInt(2, 6);
for (int i = 0; i < n; i++) {
TimeUnit.SECONDS.sleep(1L);
System.out.println(type + ":" + n + "-" + i);
}
}catch (Exception e){
e.printStackTrace();
}
return t;
}
public static class A{
String name;
public A name(String name){ this.name = name; return this; }
}
public static class B{
String name;
public B name(String name){ this.name = name; return this; }
}
public static class C{
String name;
public C name(String name){ this.name = name; return this; }
}
public static class D{
String name;
public D name(String name){ this.name = name; return this; }
}
public static class E{
String name;
public E name(String name){ this.name = name; return this; }
}
}
日志
start
doA:4-0
doB:2-0
doA:4-1
doB:2-1
doA:4-2
doA:4-3
doC:2-0
doC:2-1
doE:3-0
doD:5-0
doE:3-1
doD:5-1
doD:5-2
doE:3-2
doD:5-3
doD:5-4
res:2-0
res:2-1
res={[AB=C]&D}|{[AB=C]^E}
end