Java 中的线程是什么,如何创建和管理线程-下(十三)

news/2024/11/24 6:47:29/

书接上文

  1. CompletableFuture

CompletableFuture 是 Java 8 中新增的类,提供了更为强大的异步编程支持。它可以将多个异步任务组合成一个整体,并且可以处理异常情况。

例如,可以使用 CompletableFuture 来实现异步任务的串行执行:

public class MyTask {public CompletableFuture<String> doTaskAsync() {CompletableFuture<String> future = new CompletableFuture<>();Thread t = new Thread(() -> {String result = doTask();future.complete(result);});t.start();return future;}private String doTask() { // 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "result";}
}public class Test {public static void main(String[] args) throws Exception {MyTask task = new MyTask();CompletableFuture<String> future1 = task.doTaskAsync();CompletableFuture<String> future2 = future1.thenApply(result -> result + "2");CompletableFuture<String> future3 = future2.thenApply(result -> result + "3");String result = future3.get();System.out.println("Result: " + result);}
}

在上面的例子中,使用 thenApply() 方法将多个异步任务串行执行,并且可以对每个任务的结果进行处理。

  1. RxJava

RxJava 是一个基于响应式编程的框架,可以用于处理异步任务。它提供了丰富的操作符来方便地处理异步数据流。

例如,在 RxJava 中可以使用 flatMap 操作符实现多个异步任务的并行执行:

Observable.fromCallable(() -> doTask1()).subscribeOn(Schedulers.io()).flatMap(result1 -> Observable.fromCallable(() -> doTask2())).subscribeOn(Schedulers.io()).flatMap(result2 -> Observable.fromCallable(() -> doTask3())).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result3 -> {// 处理结果}, throwable -> {// 处理异常});

在上面的例子中,使用 fromCallable() 方法将每个任务封装成一个 Observable,然后使用 flatMap() 方法将多个 Observable 合并成一个,并且可以在其中指定线程池来处理任务。最后使用 observeOn() 方法将结果切换到主线程进行处理。

  1. Kotlin 协程

Kotlin 协程是一种轻量级的异步编程方式,它把异步任务看作是挂起函数(suspend function),通过协程上下文(CoroutineContext)和调度器(Dispatcher)来管理挂起函数的执行。

例如,在 Kotlin 协程中可以使用 async 和 await 函数实现多个异步任务的并行执行:

val result1 = async { doTask1() }
val result2 = async { doTask2() }
val result3 = async { doTask3() }val finalResult = result1.await() + result2.await() + result3.await()

在上面的例子中,使用 async 函数将每个任务封装成一个 Deferred 对象,并且可以同时执行多个任务。最后使用 await 函数等待所有任务完成并获取结果。

总结

以上是几种常用的异步编程方式,每种方式都有其优缺点和适用场景。需要根据具体情况选择合适的方式来处理异步任务,以提高程序的并发性和响应性能。


http://www.ppmy.cn/news/59535.html

相关文章

行人重识别数据集Person Re-Identification Datasets(全)

DatasetRelease time# identities# cameras# imagesLabel methodCrop sizeMulti-shotTracking sequencesFull frames availabilityVIPeR200763221264Hand128X48ETH1,2,3200785, 35, 2818580HandVary✔✔✔QMUL iLIDS20091192476HandVary✔GRID2009102581275HandVaryCAVIAR4ReID…

JAVAScript入门指南 - 从零基础到快速开发

JAVAScript是一门在网站开发中使用广泛的编程语言&#xff0c;它能够帮助你创造动态的网页&#xff0c;并让用户与网站交互。很多人对于JAVAScript入门感到很困惑&#xff0c;那么&#xff0c;本篇文章将详细地介绍JAVAScript的入门知识。 一、入门介绍 JAVAScript是一种轻量…

P3029 [USACO11NOV]Cow Lineup S 双指针 单调队列

“五一”小长假来了趟上海&#xff0c;在倒数第二天终于有时间做了一会儿题目&#xff0c;A了之后过来写一篇题解 【问题描述】 农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种&#xff0c;他喜欢他的照片包含每个品种的至少一头牛。 约翰的牛都站在一条沿…

KL散度

KL散度&#xff08;Kullback-Leibler divergence&#xff09;&#xff0c;也称为相对熵&#xff08;relative entropy&#xff09;&#xff0c;是用来衡量两个概率分布之间差异的一种指标。在机器学习中&#xff0c;KL散度常常用于度量两个概率分布之间的相似度或差异性。 具体…

【Git】‘git‘ 不是内部或外部命令,也不是可运行的程序

一、问题 我想利用git clone命令从github上下载项目源代码&#xff0c;发现报错&#xff1a; git 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。我用cmd跑一下git命令&#xff0c;发现报错&#xff1a; 二、问题分析 这个错误提示表明您的系统中没有安装…

报错:RuntimeError: CUDA error: device-side assert triggered

在运行CGAN代码时&#xff0c;有几个报错&#xff0c;记录解决办法 一、报错1 C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Indexing.cu:1146: block: [0,0,0], thread: [39,0,0] Assertion srcIndex < srcSelectDimSize failed. C:\cb\pytorch_10000000…

音视频八股文(10)-- mp4结构

介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14&#xff0c;出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器&#xff0c;⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。&#xff08;顺便⼀提&#xff0c;⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10&#xff09…

画了个 MSP430F149的最小系统板 开源出来了

使用MSP430F149单片机设计的一个最小系统板&#xff0c;包含晶振电路、复位电路、CH340串口和BSL下载电路、按键和LED电路等&#xff0c;使用了Type-C接口作为供电和串口通信&#xff0c;另外引出了JTAG接口&#xff0c;所有IO口都引出了。 板载了3个按键和LED&#xff0c;可以…