并发编程
CompletableFuture入门
复习FutureTask (Callable内容)
CompletableFuture与FutureTask都是Future接口的实现类
并发是程序上的逻辑概念,
并行是物理上的概念
并发和并行的区别:
例子一:
假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务
顺序执行:老师甲先帮学生A辅导,辅导完之后再取给B辅导,最后再去给C辅导,效率低下 ,很久才完成三个任务
并发:老师甲先给学生A去讲思路,A听懂了自己书写过程并且检查,而甲老师在这期间直接去给B讲思路,讲完思路再去给C讲思路,让B自己整理步骤。这样老师就没有空 着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,这在这期间,老师是完全空着的,没做事的,所以效率低下。
并行:直接让三个老师甲、乙、丙三个老师“同时”给三个学生辅导作业,也完成的很快。
理解:
解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
普通解释:
并发:交替做不同事情的能力
并行:同时做不同事情的能力
专业术语:
并发:不同的代码块交替执行
并行:不同的代码块同时执行
原文链接:https://blog.csdn.net/qq_27825451/article/details/78850336
如果程序是采用多线程的技术编写的,那么运行在单核单线程的机器上就会并发执行,运行在多核/多线程的机器上就会并行执行。
线程创建
继承Thread类,实现Runnable接口,
第三, 实现Callable接口,FutureTask接收结果
FutureTask<String> task = new FutureTask(callable);
CompletableFuture创建线程
一个场景:小白来到餐厅点菜,厨师炒菜打饭,小白开吃
一个工具类
CompletableFuture.supplyAsync() 开启任务
public class SmallTool {
public static void sleepMillis(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void printTimeAndThread(String tag) {
String result = new StringJoiner("\t|\t")
.add(String.valueOf(System.currentTimeMillis()))
.add(String.valueOf(Thread.currentThread().getId()))
.add(Thread.currentThread().getName())
.add(tag)
.toString();
System.out.println(result);
}
}
public class _01_supplyAsync {
public static void main(String[] args) {
SmallTool.printTimeAndThread("小白进入了餐厅");
SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("厨师炒菜");
SmallTool.sleepMillis(200);
SmallTool.printTimeAndThread("厨师打饭");
SmallTool.sleepMillis(100);
return "番茄炒蛋 + 米饭 做好了";
});
SmallTool.printTimeAndThread("小白在打王者");
SmallTool.printTimeAndThread(String.format("%s ,小白开吃", cf1.join()));
}
}
join() 方法会等待任务执行结束,然后返回任务的结果。
结果:
1620331256949 | 1 | main | 小白进入了餐厅
1620331256949 | 1 | main | 小白点了 番茄炒蛋 + 一碗米饭
1620331257003 | 1 | main | 小白在打王者
1620331257004 | 12 | ForkJoinPool.commonPool-worker-1 | 厨师炒菜
1620331257204 | 12 | ForkJoinPool.commonPool-worker-1 | 厨师打饭
1620331257327 | 1 | main | 番茄炒蛋 + 米饭 做好了 ,小白开吃
改进第一个场景
餐厅有两个人,厨师炒菜,服务员打饭上菜
thenCompse() --连接任务
public class _02_thenCompose {
public static void main(String[] args) {
SmallTool.printTimeAndThread("小白进入了餐厅");
SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("厨师炒菜");
SmallTool.sleepMillis(200);
return "番茄炒蛋";
}).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
SmallTool.printTimeAndThread("服务员打饭");
SmallTool.sleepMillis(100);
return dish +"米饭";
}));
SmallTool.printTimeAndThread("小白在打王者");
SmallTool.printTimeAndThread(String