在开发中偶尔也会需要用到线程编排,比如查询商品数据,
查询商品规格信息和商品图片耗时分别是1.2s和5s,如果是异步执行,那么就可以使用5s完成查询了.而不是6.2s,这里记录一下
CompletableFuture完成线程编排.
import java.util.concurrent.*;
public class Test3 {
public static ExecutorService threadPool = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> futureImg = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询商品图片信息 - 3");
return "iphoneXR.jpg";
}, threadPool);
CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询商品属性 - 5");
return "黑色+512GB";
}, threadPool);
CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询商品介绍 - 1");
return "Apple";
}, threadPool);
CompletableFuture<String> futureDesc4 = CompletableFuture.supplyAsync(() -> {
try {
int i = 0;
while(true){
Thread.sleep(1000);
System.out.println("耗时:"+ ++i +"s");
if(i > 8 ){
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Apple";
}, threadPool);
CompletableFuture<Void> allOf = CompletableFuture.allOf(futureImg, futureAttr, futureDesc);
allOf.get();// 等待所有任务执行完成 返回结果
System.out.println("主线程执行 end");
}
public static class Runable01 implements Runnable{
@Override
public void run() {
System.out.println("当前线程" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("结果" + i);
}
}
}
结果:
查询商品介绍 - 1
耗时:1s
耗时:2s
查询商品图片信息 - 3
耗时:3s
耗时:4s
查询商品属性 - 5
主线程执行 end
耗时:5s
耗时:6s
耗时:7s
耗时:8s
耗时:9s
可以看到实际上在5s的时候,最后一个已经查询完了