开启线程的方式
JAVA开启线程的三种方式
除了以上三种还可以通过线程池开启
Callable与Future(带返回值的异步线程)
CompletableFuture(带返回值升级版)
当几个异步任务相互关联时就要使用到异步任务编排
学习 CompletableFuture 进阶之前先掌握两种线程池
异步编程利器:CompletableFuture详解 |Java 开发实战
CompletableFuture异步和线程池讲解
springboot线程池和CompletableFuture配合使用
当几个异步任务相互关联时就要使用到异步任务编排
详情可参考b站视频
CompletableFuture入门
supplyAsync(开启异步任务,带返回值)
package com.example.shiyan.thread;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo1 {
public static void main(String[] args) throws InterruptedException {
long l = System.currentTimeMillis();
System.out.println("小白进入餐厅");
System.out.println("小白点餐");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
try {
System.out.println("厨师做饭");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "饭做好了";
});
System.out.println("小白打游戏");
System.out.println(String.format("%s ,小白开吃", cf1.join()));
System.out.println(System.currentTimeMillis() - l);
}
}
thenCompose(任务A然后紧接着任务B)
package com.example.shiyan.thread;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo2 {
public static void main(String[] args) throws InterruptedException {
long l = System.currentTimeMillis();
System.out.println("小白进入餐厅");
System.out.println("小白点餐");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
System.out.println("厨师炒菜");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "番茄炒蛋";
}).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
System.out.println("服务员打饭");
} catch (InterruptedException e) {
e.printStackTrace();
}
return dish+"+米饭";
}));
System.out.println("小白打游戏");
System.out.println(String.format("%s 好了,小白开吃", cf1.join()));
System.out.println(System.currentTimeMillis() - l);
}
}
thenCombine(任务a,任务b都完成后接上任务c)
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo3 {
public static void main(String[] args) throws InterruptedException {
long l = System.currentTimeMillis();
System.out.println("小白进入餐厅");
System.out.println("小白点餐");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
System.out.println("厨师炒菜");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "番茄炒蛋";
}).thenCombine(CompletableFuture.supplyAsync(()->{
try {
Thread.sleep(2000);
System.out.println("服务员煮饭");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "米饭";
}),(dish,rice)->{
try {
Thread.sleep(2000);
System.out.println("服务员打饭");
} catch (InterruptedException e) {
e.printStackTrace();
}
return String.format("%s+%s 好了",dish,rice);
});
System.out.println("小白打游戏");
System.out.println(String.format("%s ,小白开吃", cf1.join()));
System.out.println(System.currentTimeMillis() - l);
}
}