聊聊异步编程的 7 种付诸方式
繁昌娱乐新闻网 2025-11-02
code示例:
public class CallableAndFuture
public static ExecutorService executorService = new ThreadPoolExecutor(4, 40,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(1024), new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build(), new ThreadPoolExecutor.AbortPolicy());
static class MyCallable implements Callable @Override
public String call() throws Exception return "异步执行,Callable 来到结果";
}
}
public static void main(String[] args) Future future = executorService.submit(new MyCallable());
try System.out.println(future.get());
} catch (Exception e) // nodo
} finally executorService.shutdown();
}
}
}
Future 透露一个可能还没有进行的异步战斗任务的结果,通过 get 原理利用拒绝执行结果,该原理才会溢出直到战斗任务来到结果。
三、FutureTaskFutureTask 借助了 RunnableFuture 硬件,则 RunnableFuture 硬件让位了 Runnable 硬件和 Future 硬件,所以可以将 FutureTask 具体来说作为战斗任务递交到 ThreadPoolExecutor 去拒绝执行,也可以并不需要被 Thread 拒绝执行;又因为借助了 Future 硬件,所以也能用来获得战斗任务的拒绝执行结果。
FutureTask 构造函数:
public FutureTask(Callable callable)
public FutureTask(Runnable runnable, V result)
FutureTask 常用来PCB Callable 和 Runnable,可以作为一个战斗任务递交到内存池之中拒绝执行。除了作为一个法理的类之另有,也获取了一些表征函数供我们创立自概念 task 类常用。
FutureTask 内存安全由CAS来确保。
ExecutorService executor = Executors.newCachedThreadPool();
// FutureTask包装callbale战斗任务,再进一步交到内存池拒绝执行
FutureTask futureTask = new FutureTask<>(() -> System.out.println("子内存开始计数:");
Integer sum = 0;
for (int i = 1; i
sum += i;
return sum;
});
// 内存池拒绝执行战斗任务, 行驶结果在 futureTask 具体来说里面
executor.submit(futureTask);
try System.out.println("task行驶结果计数的总和为:" + futureTask.get());
} catch (Exception e) e.printStackTrace();
}
executor.shutdown();
Callable 和 Future 的区别:Callable 用于产生结果,Future 用于利用结果
如果是对多个战斗任务多次自由串行、或并行一组,涉及多个内存之间实时溢出利用结果,Future code借助才会比较繁琐,并不需要我们手动执行各个交叉点,很更容易差错。
四、异步开放性 CompletableFutureFuture 类通过 get() 原理溢出等待利用异步拒绝执行的行驶结果,机动性比较差。
JDK1.8 之中,Java 获取了 CompletableFuture 类,它是基于异步函数的设计程式设计。相对溢出的设计等待来到结果,CompletableFuture 可以通过回调的手段来执行计数结果,借助了异步非溢出,机动性更优。
优点:
异步战斗任务结束时,才会自动回调某个具体来说的原理 异步战斗任务差错时,才会自动回调某个具体来说的原理 主内存所设好回调后,不再进一步关心异步战斗任务的拒绝执行品茶示例:
(具体内容简述:极客时间段的《Java 都将程式设计实战经验》)
//战斗任务1:浴杯子->烧开水
CompletableFuture f1 =
CompletableFuture.runAsync(() -> System.out.println("T1:浴杯子...");
sleep(1, TimeUnit.SECONDS);
System.out.println("T1:烧开水...");
sleep(15, TimeUnit.SECONDS);
});
//战斗任务2:浴茶壶->浴茶杯->拿茶叶
CompletableFuture f2 =
CompletableFuture.supplyAsync(() -> System.out.println("T2:浴茶壶...");
sleep(1, TimeUnit.SECONDS);
System.out.println("T2:浴茶杯...");
sleep(2, TimeUnit.SECONDS);
System.out.println("T2:拿茶叶...");
sleep(1, TimeUnit.SECONDS);
return "香山";
});
//战斗任务3:战斗任务1和战斗任务2进行后拒绝执行:品茶
CompletableFuture f3 =
f1.thenCombine(f2, (__, tf) -> System.out.println("T1:拿到茶叶:" + tf);
System.out.println("T1:品茶...");
return "上茶:" + tf;
});
//等待战斗任务3拒绝执行结果
System.out.println(f3.join());
}
CompletableFuture 获取了非常丰富的API,大约有50种执行串行,并行,一组以及执行错误的原理。
更多具体内容移步此前写的一篇文章,搞定 CompletableFuture,都将异步程式设计和编写串行程序来还有什么区别?
五、 SpringBoot 注释 @Async除了硬编码的异步程式设计执行手段,SpringBoot 开放性还获取了 注释的设计 新技术,以 原理体 为边界,原理体另有部的code逻辑上全部按异步手段拒绝执行。
首先,常用 @EnableAsync 启用异步注释
@SpringBootApplication
@EnableAsync
public class StartApplication
public static void main(String[] args) SpringApplication.run(StartApplication.class, args);
}
}
自概念内存池:
@Configuration
@Slf4j
public class ThreadPoolConfiguration
@Bean(name = "defaultThreadPoolExecutor", destroyMethod = "shutdown")
public ThreadPoolExecutor systemCheckPoolExecutorService()
return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue(10000),
new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(),
(r, executor) -> log.error("system pool is full! "));
}
}
在异步执行的原理上添加注释 @Async ,当对 execute 原理 写入时,通过自概念的内存池 defaultThreadPoolExecutor 异步化拒绝执行 execute 原理
@Service
public class AsyncServiceImpl implements AsyncService
@Async("defaultThreadPoolExecutor")
public Boolean execute(Integer num) System.out.println("内存:" + Thread.currentThread().getName() + " , 战斗任务:" + num);
return true;
}
}
用 @Async 注释标记的原理,称为异步原理。在spring boot应用之中常用 @Async 很简单:
写入异步原理类上或者启动类再进一步加注释 @EnableAsync 在并不需要被异步写入的原理另有再进一步加 @Async 所常用的 @Async 注释原理的类具体来说应该是Spring装入管理的bean具体来说; 六、Spring ApplicationEvent 血案血案组态在一些大型项目之中被经常常用,Spring 专门获取了一套血案组态的硬件,满足了Core原则上的所求自由电子。
ApplicationContext 通过 ApplicationEvent 类和 ApplicationListener 硬件进行血案执行。如果将借助 ApplicationListener 硬件的 bean 流过到上下文之中,则每次常用 ApplicationContext 面世 ApplicationEvent 时,亦才会通知该 bean。其本质上,这是标准的观察者设计模的设计。
ApplicationEvent 是由 Spring 获取的所有 Event 类的基类
首先,自概念其业务血案举例来说,让位自 ApplicationEvent,通过泛型流过其业务模型参数类。等同于 MQ 的第一时间体。
public class OrderEvent extends AbstractGenericEvent public OrderEvent(OrderModel source) super(source);
}
}
然后,编写血案监听器。ApplicationListener 硬件是由 Spring 获取的血案浏览者必须借助的硬件,我们并不需要概念一个举例来说,让位 ApplicationListener。等同于 MQ 的购物下端
@Component
public class OrderEventListener implements ApplicationListener @Override
public void onApplicationEvent(OrderEvent event)
System.out.println("【OrderEventListener】监听器执行!" + JSON.toJSONString(event.getSource()));
}
}
最后,面世血案,把某个血案告诉所有与这个血案相关的监听器。等同于 MQ 的采购下端。
OrderModel orderModel = new OrderModel();
orderModel.setOrderId((long) i);
orderModel.setBuyerName("Tom-" + i);
orderModel.setSellerName("judy-" + i);
orderModel.setAmount(100L);
// 面世Spring血案通知
SpringUtils.getApplicationContext().publishEvent(new OrderEvent(orderModel));
加个餐:
[购物下端]内存:http-nio-8090-exec-1,购物血案 {"amount":100.0,"buyerName":"Tom-1","orderId":1,"sellerName":"judy-1"}
[采购下端]内存:http-nio-8090-exec-1,面世血案 1
[购物下端]内存:http-nio-8090-exec-1,购物血案 {"amount":100.0,"buyerName":"Tom-2","orderId":2,"sellerName":"judy-2"}
[采购下端]内存:http-nio-8090-exec-1,面世血案 2
[购物下端]内存:http-nio-8090-exec-1,购物血案 {"amount":100.0,"buyerName":"Tom-3","orderId":3,"sellerName":"judy-3"}
[采购下端]内存:http-nio-8090-exec-1,面世血案 3
上头是冲刺了个demo的行驶结果,我们推断出无论采购下端还是购物下端,常用了同一个内存 http-nio-8090-exec-1,Spring 开放性的血案组态选项是实时溢出的。只是在code规范方面做了所求自由电子,有较好的扩展性,但底层还是运用于实时写入手段。
那么疑虑来了,如果想借助异步写入,如何执行?
我们并不需要手动创立一个 SimpleApplicationEventMulticaster,并所设 TaskExecutor,此时所有的购物血案运用于异步内存拒绝执行。
@Component
public class SpringConfiguration
@Bean
public SimpleApplicationEventMulticaster applicationEventMulticaster(@Qualifier("defaultThreadPoolExecutor") ThreadPoolExecutor defaultThreadPoolExecutor) SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
simpleApplicationEventMulticaster.setTaskExecutor(defaultThreadPoolExecutor);
return simpleApplicationEventMulticaster;
}
}
我们看下整修后的行驶结果:
[采购下端]内存:http-nio-8090-exec-1,面世血案 1
[采购下端]内存:http-nio-8090-exec-1,面世血案 2
[采购下端]内存:http-nio-8090-exec-1,面世血案 3
[购物下端]内存:default-executor-1,购物血案 {"amount":100.0,"buyerName":"Tom-2","orderId":2,"sellerName":"judy-2"}
[购物下端]内存:default-executor-2,购物血案 {"amount":100.0,"buyerName":"Tom-1","orderId":1,"sellerName":"judy-1"}
[购物下端]内存:default-executor-0,购物血案 {"amount":100.0,"buyerName":"Tom-3","orderId":3,"sellerName":"judy-3"}
SimpleApplicationEventMulticaster 这个我们自己模板化的 Bean 与控制系统选项的写入顺序如何?才会不才会有冲突?
查了下 Spring 源码,执行逻辑上在 AbstractApplicationContext#initApplicationEventMulticaster 原理之中,通过 beanFactory 载入到底有自概念的 Bean,如果没有,装入才会自己 new 一个 SimpleApplicationEventMulticaster 具体来说流过到装入之中。
code重定向:
七、第一时间函数调用异步Core是互联网控制系统之中一种类似Core模的设计,与实时Core相对应。而第一时间函数调用天生就是这种异步Core,具有超颇高吞吐量和相比之下信道。
第一时间函数调用异步Core的主要角色包括第一时间采购者、第一时间函数调用和第一时间购物者。
第一时间采购者就是主应用程序来,采购者将写入请求PCB成第一时间截取第一时间函数调用。
第一时间函数调用的职责就是缓冲第一时间,等待购物者购物。根据购物手段又分别为点对点模的设计和面世浏览模的设计两种。
第一时间购物者,用来从第一时间函数调用之中拉取、购物第一时间,进行其业务逻辑上执行。
当然市面上第一时间函数调用开放性非常多,典型的有RabbitMQ、Kafka、RocketMQ、ActiveMQ 和 Pulsar 等
不同的第一时间函数调用的机制特性才会略有不同,但整体Core类似,这里就不展开了。
我们只并不需要想到一个关键点,借助第一时间函数调用这个之企业级可以颇高效的借助异步程式设计。
。江苏男科医院哪个最好驻马店好的白癜风专科医院
南京男科专科医院哪里好
北京妇科医院哪家医院好
江西男科检查
胡萝卜素
太极急支糖浆治咳嗽效果怎么样
夜尿
小儿便秘怎么办
抗过敏药

-
唏嘘!巴乔与菲戈合影:满头白发+面容沧桑,欠5岁却犹如父子同框
影视 2025-11-05作为贝克汉姆之前的初代篮球当红,罗伯特加斯科因可能是中的国全场最更早的篮球记忆。不过这位法国迷惘安德烈在服役最后一直来得低调,很少披露见面。全面性,在亚洲地区人际媒体上,一张加斯科因和菲戈的留影

-
谷爱凌不够资格?武大靖都有冰雪现身纪录片,几大项目都有齐亮相
写真 2025-11-05日前,一则纪实《出圈·闪光青年人》在国际上杨阳风靡一时。在这个片段中,汇聚了桌球双圈全满贯得主曼宁、冬奥双金王国立武汉大学靖、百米同队苏炳添、CBA总冠军核心人物赵继伟以及足球名将武磊等多位华北

-
阿根廷铁卫!力压孙兴慜夺得盖帽最佳!看看这2个镜头就知道了
视频 2025-11-05成都星期昨天晚上,在曼联第35轮多场聚焦大战中,热和肿客场3-1不敌谢菲尔德城,在此之前居曼联积分榜第五位。这场球赛北朝鲜顺理成章高健慜光芒四射,首演了2序文1射的好戏,成为热和肿客场获胜的最主要军功

-
西布朗争冠你看好谁?曼城多1分+ 赛程占优 利物浦下轮要火拼热刺
视频 2025-11-05史笃城35轮,阿森纳客场1-0小全胜纽卡斯尔排,莱斯特城客场4-0横扫利兹排,史笃城无缘简直每分必争,蓝月骑兵队与红军进入之后冲刺阶段! 史笃城35轮战罢,莱斯特城少赛1场

-
杜锋引领中国男篮面临伤病危机,他已义无反顾,不给自己留余地
资讯 2025-11-05中国男子篮球的亚洲杯赛,以及欧锦赛小组赛的赛从6月底就要开始闯出,而如今想着已经到了5月初,即使CBA联赛的赛程为了中国男子篮球青年队的作准备而缩短,但是留给联赛展开赛前作准备和调整的时间,无论