imtoken钱包官方版下载安卓版|comp

作者: imtoken钱包官方版下载安卓版
2024-03-07 17:56:04

COMP中文(简体)翻译:剑桥词典

COMP中文(简体)翻译:剑桥词典

词典

翻译

语法

同义词词典

+Plus

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录

/

注册

中文 (简体)

查找

查找

英语-中文(简体)

comp 在英语-中文(简体)词典中的翻译

compverb [ T ] mainly US informal uk

Your browser doesn't support HTML5 audio

/kɒmp/ us

Your browser doesn't support HTML5 audio

/kɑːmp/

Add to word list

Add to word list

to give someone something valuable without asking for payment

馈赠,赠送

Usually, the writer's entire trip is comped.

一般来说作者全部旅程的费用都是全包的。

They comped us two tickets.

他们赠送我们两张票。

comped meals/drinks

馈赠的饭/饮料

to allow someone to do something without having to pay

让…不花钱(做某件事)

You can comp two guests.

你可以免费带两个客人来。

(comp在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)

comp的例句

comp

Almost all comp cards are in color but may include black-and-white images.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

The band started to record a series of songs, most for the album and some for some splits and comps that were offered.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

An artists proof is also known as a comp or complimentary if given to printers.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

Strictly speaking, these operators are defined on all elements, but we require that 0 (e), 1 (e) are typed state if and only if e has type comp.

来自 Cambridge English Corpus

Locals casinos will typically offer comps, such as free meals at the casino's restaurants, at a higher rate than tourist-oriented casinos.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

Many casinos have attached hotels, but those that don't may have the ability to comp rooms to a hotel nearby.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

With respect to their rhythm, some palos such as grananas, malagueas, and fandango libre, are rendered in free rhythm, whereas most others are metered, that is, in comps.

来自 Wikipedia

该例句来自维基百科,在CC BY-SA许可下可重复使用。

I agree with "comps", but don't ruin the others.

来自 Hansard archive

该例句来自Hansard存档。包含以下议会许可信息开放议会许可v3.0

示例中的观点不代表剑桥词典编辑、剑桥大学出版社和其许可证颁发者的观点。

C1

comp的翻译

中文(繁体)

饋贈,贈送, 讓…不花錢(做某件事)…

查看更多内容

西班牙语

forma abreviada de "competition":, competición, concurso…

查看更多内容

葡萄牙语

oferecer como cortesia, compensação, remuneração…

查看更多内容

需要一个翻译器吗?

获得快速、免费的翻译!

翻译器工具

comp的发音是什么?

在英语词典中查看 comp 的释义

浏览

Comoran

comorbid

comorbidity

Comoros

comp

comp time

compact

compact disc

compaction

comp更多的中文(简体)翻译

全部

comp time

fully comp

comp time, at compensatory time

查看全部意思»

“每日一词”

veggie burger

UK

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɜː.ɡər/

US

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɝː.ɡɚ/

a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape

关于这个

博客

Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)

March 06, 2024

查看更多

新词

stochastic parrot

March 04, 2024

查看更多

已添加至 list

回到页面顶端

内容

英语-中文(简体)例句翻译

©剑桥大学出版社与评估2024

学习

学习

学习

新词

帮助

纸质书出版

Word of the Year 2021

Word of the Year 2022

Word of the Year 2023

开发

开发

开发

词典API

双击查看

搜索Widgets

执照数据

关于

关于

关于

无障碍阅读

剑桥英语教学

剑桥大学出版社与评估

授权管理

Cookies与隐私保护

语料库

使用条款

京ICP备14002226号-2

©剑桥大学出版社与评估2024

剑桥词典+Plus

我的主页

+Plus 帮助

退出

词典

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

翻译

语法

同义词词典

Pronunciation

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录 /

注册

中文 (简体)  

Change

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

关注我们

选择一本词典

最近的词和建议

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

语法与同义词词典

对自然书面和口头英语用法的解释

英语语法

同义词词典

Pronunciation

British and American pronunciations with audio

English Pronunciation

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

词典+Plus

词汇表

选择语言

中文 (简体)  

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

内容

英语-中文(简体) 

 Verb

例句

Translations

语法

所有翻译

我的词汇表

把comp添加到下面的一个词汇表中,或者创建一个新词汇表。

更多词汇表

前往词汇表

对该例句有想法吗?

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

JAVA 多线程、CompleableFuture异步编程_java compositefuture-CSDN博客

>

JAVA 多线程、CompleableFuture异步编程_java compositefuture-CSDN博客

JAVA 多线程、CompleableFuture异步编程

最新推荐文章于 2024-03-06 15:11:41 发布

qq_43659061

最新推荐文章于 2024-03-06 15:11:41 发布

阅读量919

收藏

2

点赞数

文章标签:

多线程

java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_43659061/article/details/112524134

版权

初始化线程的四种办法

继承Thread类实现Rannable 接口实现callable 接口 + FutureTask (可以获取处理结果和处理异常)线程池

继承Thread实现

public class ThreadTest {

public static void main(String[] args) {

System.out.println("主线程启动");

Thread1 thread1 = new Thread1();

thread1.start();

System.out.println("主线程结束");

}

public static class Thread1 extends Thread{

@Override

public void run() {

System.out.println("===========================");

System.out.println("当前线程---->"+Thread.currentThread().getId());

int i = 10 / 2;

System.out.println("当前线程处理结果---->"+i);

System.out.println("===========================");

}

}

}

执行结果:

实现Runnable接口实现

public class ThreadTest {

public static void main(String[] args) {

System.out.println("主线程启动");

new Thread(new Thread1()).start();

System.out.println("主线程结束");

}

public static class Thread1 implements Runnable{

@Override

public void run() {

System.out.println("===========================");

System.out.println("当前线程---->"+Thread.currentThread().getId());

int i = 10 / 2;

System.out.println("当前Runnable线程处理结果---->"+i);

System.out.println("===========================");

}

}

}

执行结果:

实现Runnable实现

可以使用FatureTask接收异步线程的执行结果,只有所有线程执行完才能得到结果,是阻塞等待

public class ThreadTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

FutureTask futureTask = new FutureTask<>(new Thread1());

new Thread(futureTask).start();

//阻塞等待,当所有线程执行完才能得到结果

//等待整个线程执行完,获取执行结果

Integer integer = futureTask.get();

System.out.println("futureTask执行结果:"+integer);

System.out.println("主线程结束");

}

public static class Thread1 implements Callable {

@Override

public Integer call() throws Exception {

System.out.println("===========================");

System.out.println("当前线程---->"+Thread.currentThread().getId());

int i = 10 / 2;

System.out.println("当前Callable线程处理结果---->"+i);

System.out.println("===========================");

return i;

}

}

}

执行结果:

线程池

为什么使用线程池: 降低资源消耗:通过重复利用已经创建好的线程,减少线程创建销毁的损耗。

提高响应速度:因为线程池线程没有超过最大线程数时,有的线程处于空闲等待任务状态,当任务进来无需创建新的线程就能执行

提高线程的可管理性:线程池会根据系统的特点会对线程池内线程进行优化处理,减少创建和销毁带来的系统开销,无限的创建和销毁线程不仅损耗系统性能,还降低系统的稳定性,使用线程池来进行统一的管理分配

在我们的业务代码中,都不用以上三种但是,因为可能会导致我们的资源耗尽,这将会是没有更多的资源来处理核心业务。应该将所有的多线程异步任务都交给线程池,这样只有一个执行完才能继续拿到线程资源执行下一个任务,这样能有效的控制我们的资源。

创建线程池的方式

使用JUC包下的Executors来创建一个线程池

//固定长度的线程池

ExecutorService service = Executors.newFixedThreadPool(10);

service.execute(new Thread(()-> System.out.println("异步线程执行")));

这种方式有常见的四种线程池

Executors.newCachedThreadPool():创建一个可缓存线程池,如果线程池长度超过需要处理,可灵活的回收空闲线程,没有则创建新线程

public static ExecutorService newCachedThreadPool() {

return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

60L, TimeUnit.SECONDS,

new SynchronousQueue());

}

Executors.newFixedThreadPool():创建一个固定大小的线程池,可控制线程的最大并发量,超出的将会在队列中等待。核心线程数等于最大线程数

public static ExecutorService newFixedThreadPool(int nThreads) {

return new ThreadPoolExecutor(nThreads, nThreads,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue());

}

Executors.newScheduledThreadPool():创建一个定时线程池,支持定时或周期性的执行任务Executors.newSingleThreadExecutor():创建一个单线程的线程池,后台从队列中获取任务,挨个执行

public static ExecutorService newSingleThreadExecutor() {

return new FinalizableDelegatedExecutorService

(new ThreadPoolExecutor(1, 1,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue()));

}

使用new ThreadPoolExecutor();来创建线程池, ThreadPoolExecutor七大参数:

int corePoolSize:核心线程数,线程池创建好就准备就绪的线程数,等待异步任务执行,这些线程将会一直存在,除非allowCoreThreadTimeOutint maximumPoolSize:最大线程数,用来控制资源并发long keepAliveTime:存活时间,当线程数大于核心时,这是多余空闲线程在终止前等待新任务的最长时间,超过存活时间将会释放空闲线程TimeUnit unit:时间单位,存活时间的时间单位BlockingQueue workQueue:阻塞队列,如果任务有很多,查出最大线程数,多余的任务将会放入队列,等待线程空闲从队列中取出并继续执行ThreadFactory threadFactory:线程的创建工厂RejectedExecutionHandler handler:拒绝处理控制器,如果队列的满了,按照我们指定的拒绝策略来拒绝执行任务

工作顺序:

线程池创建,准备好核心线程数的核心线程,准备接收任务如果核心线程已经满了,后续进来的任务将放到阻塞队列中等待,当核心线程执行完以后就会从队列中获取任务执行如果阻塞队列满了,将会启动新的线程执行任务,最大数不能超过最大线程数,来进行资源控制如果最大线程数也用完,将会执行我们的拒绝策略RejectedExecutionHandler来拒绝任务如果最大线程数都执行完,有很多空闲的线程,这些线程将会在执行的存活之间过后进行释放,释放最大线程数-核心线程数,核心线程会一直存在

创建线城池 创建一个核心数为10、最大线程数为100、存活时间为10秒,JUC包下LinkedBlockingDeque长度为1000的阻塞队列,JUC下默认的线程工厂defaultThreadFactory,ThreadPoolExecutor.AbortPolicy()直接丢弃的拒绝策略的线程池

ThreadPoolExecutor executor = new ThreadPoolExecutor(

10,

100,

10,

TimeUnit.SECONDS,

new LinkedBlockingDeque<>(1000),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.AbortPolicy()

);

比如一个线程池,核心线程8、最大线程20、阻塞队列50,如果此时进来100个请求进来将会怎么分配。

首先核心线程直接执行8个,这时候不会直接开其他线程,将会放到队列50个,队列满了以后将会开启12个线程,其他的任务都会被丢弃。

如果不想直接被丢弃,可以采用DiscardPolicy这种拒绝策略,这将会直接执行线程的run()方法,是同步执行

区别

继承Thread、实现Rannable接口创建出来的线程都不能得到返回值,Callable可以获取返回值 以上三种都不能有效的控制资源 使用线程池的方式来执行多线程任务可以有效控制资源,让性能更加稳定

CompletableFature异步编排

所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。

JDK5新增了Future接口,用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的 CPU 资源,而且也不能及时地得到计算结果。 这时候就可以用到JDK8新增的CompletableFature来进行一步任务的组合,级联调用 假设有三个异步任务A、 B、 C,异步任务都是同时执行,但是C任务需要A任务的执行结果来进行,这种情况就可以用到异步编排

* @author Doug Lea

* @since 1.8

*/

public class CompletableFuture implements Future, CompletionStage {

/**

* 可以看到CompletableFuture实现了Future,和我们的Callablel实现线程的FutureTask类似,

* 都实现了Fature接口,可以获取异步任务的结果

*/

public class FutureTask implements RunnableFuture {

public interface RunnableFuture extends Runnable, Future {

CompletableFature提供了四个方法给我们执行异步操作

/**

* 没有返回值的

*/

public static CompletableFuture runAsync(Runnable runnable) {

return asyncRunStage(asyncPool, runnable);

}

/**

* 指定线程池的

*/

public static CompletableFuture runAsync(Runnable runnable,

Executor executor) {

return asyncRunStage(screenExecutor(executor), runnable);

}

/**

* 有返回值的

*/

public static CompletableFuture supplyAsync(Supplier supplier) {

return asyncSupplyStage(asyncPool, supplier);

}

/**

* 指定线程池的

*/

public static CompletableFuture supplyAsync(Supplier supplier,

Executor executor) {

return asyncSupplyStage(screenExecutor(executor), supplier);

}

runAsync测试

public class ThreadTest {

private static ThreadPoolExecutor executor = new ThreadPoolExecutor(

10,

100,

10,

TimeUnit.SECONDS,

new LinkedBlockingDeque<>(1000),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.CallerRunsPolicy()

);

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture.runAsync(()->{

int i = 10 / 5;

System.out.println(i);

},executor);

System.out.println("主线程结束");

}

}

supplyAsync测试

public class ThreadTest {

private static ThreadPoolExecutor executor = new ThreadPoolExecutor(

10,

100,

10,

TimeUnit.SECONDS,

new LinkedBlockingDeque<>(1000),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.CallerRunsPolicy()

);

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 5;

System.out.println(i);

return i;

}, executor);

Integer integer = future.get();

System.out.println("异步执行结果:"+integer);

System.out.println("主线程结束");

}

}

线程执行完回调

public class ThreadTest {

private static ThreadPoolExecutor executor = new ThreadPoolExecutor(

10,

100,

10,

TimeUnit.SECONDS,

new LinkedBlockingDeque<>(1000),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.CallerRunsPolicy()

);

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 0;

return i;

}, executor).whenComplete((result,exception)->{

System.out.println("线程执行结果:"+result);

System.out.println("线程执行异常:"+exception);

}).exceptionally(throwable -> {

return 0;

});

Integer integer = future.get();

System.out.println("异步执行结果:"+integer);

System.out.println("主线程结束");

}

}

链式调用whenComplete只能感知是否发生异常,并不能处理异常

使用handle来处理结果

public class ThreadTest {

private static ThreadPoolExecutor executor = new ThreadPoolExecutor(

10,

100,

10,

TimeUnit.SECONDS,

new LinkedBlockingDeque<>(1000),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.CallerRunsPolicy()

);

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

return i;

}, executor).handle((result,exception)->{

if (result != null){

return result;

}

if (exception != null){

return 0;

}

return 0;

});

Integer integer = future.get();

System.out.println("异步执行结果:"+integer);

System.out.println("主线程结束");

}

}

线程串行化

/**

* 当一个线程依赖上一个线程时,获取上一个线程返回结果,并返回当前线程的结果

* A B两个线程,B 依赖 A 的返回结果时,B 可以获取 A 的返回结果拿过来计算,并返回 B 线程的执行结果

*/

public CompletableFuture thenApply(

Function fn) {

return uniApplyStage(null, fn);

}

public CompletableFuture thenApplyAsync(

Function fn) {

return uniApplyStage(asyncPool, fn);

}

public CompletableFuture thenApplyAsync(

Function fn, Executor executor) {

return uniApplyStage(screenExecutor(executor), fn);

}

//===============================================================================

/**

* 当一个线程依赖上一个线程时,获取上一个线程返回结果,并拿来计算,当前线程并无返回结果

* A B 两个线程,B 可以拿到 A 线程的返回结果,并用 A 的返回结果来计算操作,B 没有返回结果

*/

public CompletableFuture thenAccept(Consumer action) {

return uniAcceptStage(null, action);

}

public CompletableFuture thenAcceptAsync(Consumer action) {

return uniAcceptStage(asyncPool, action);

}

public CompletableFuture thenAcceptAsync(Consumer action,

Executor executor) {

return uniAcceptStage(screenExecutor(executor), action);

}

//===============================================================================

/**

* 只要上面的任务执行完成,就执行ThenRun()方法,只是一个后续操作

*/

public CompletableFuture thenRun(Runnable action) {

return uniRunStage(null, action);

}

public CompletableFuture thenRunAsync(Runnable action) {

return uniRunStage(asyncPool, action);

}

public CompletableFuture thenRunAsync(Runnable action,

Executor executor) {

return uniRunStage(screenExecutor(executor), action);

}

带有Async的都是异步的,就是另外开一个线程,不带的都是和上一个线程公用一个线程

thenRun测试

thenRun:没有返回值,不能过去到上个任务的执行结果

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor).thenRunAsync(() -> {

System.out.println("任务二执行完成");

}, executor);

System.out.println("主线程结束");

}

thenAccept测试

thenAccept:可以获取到上一任务的执行结果,没有返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor).thenAcceptAsync(res -> {

System.out.println("任务一执行结果:"+res);

},executor);

System.out.println("主线程结束");

}

thenApply测试

thenApply:可以接收到上一个任务的执行结果,并且也有返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor).thenApplyAsync(res -> {

System.out.println("任务一执行结果:" + res);

return res;

}, executor);

System.out.println(future.get());

System.out.println("主线程结束");

}

两个任务组合,都要完成

当两个CompletableFuture组合完成之后,如果还需继续执行其他任务,可以使用任务组合,必须等待前两个任务执行完才能继续执行

runAfterBoth():当两个任务执行完成之后,继续执行第三个任务,不能获取其他任务的返回结果,没有返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor);

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {

System.out.println("任务二执行完成");

return "hello world";

});

CompletableFuture voidCompletableFuture = future.runAfterBothAsync(future1, () -> {

System.out.println("任务三执行完成");

}, executor);

System.out.println(future.get());

System.out.println("主线程结束");

}

thenAcceptBoth():当两个任务执行完成之后,继续执行第三个任务,可以获取前两个任务的执行结果,没有返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor);

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {

System.out.println("任务二执行完成");

return "hello world";

});

CompletableFuture voidCompletableFuture = future.thenAcceptBothAsync(future1, (f1,f2) -> {

System.out.println("任务一的执行结果:"+f1);

System.out.println("任务二的执行结果:"+f2);

System.out.println("任务三执行完成");

}, executor);

System.out.println(future.get());

System.out.println("主线程结束");

}

thenCombine():当两个任务执行完成之后,继续执行第三个任务,可以获取前两个任务的执行结果,有返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动");

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int i = 10 / 2;

System.out.println("任务一执行完成");

return i;

}, executor);

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {

System.out.println("任务二执行完成");

return "hello world";

});

CompletableFuture future2 = future.thenCombineAsync(future1, (f1, f2) -> {

System.out.println("任务一的执行结果:" + f1);

System.out.println("任务二的执行结果:" + f2);

System.out.println("任务三执行完成");

return f1 + f2;

}, executor);

System.out.println("任务三执行结果"+future2.get());

System.out.println("主线程结束");

}

两个任务组合,一个完成

当两个CompletableFuture组合完成之后,如果还需继续执行其他任务,可以使用任务组合,只需等待两个中的其中一个执行完成,就可以执行其他任务

runAfterEither():当两个任务其中一个执行完成之后,就执行第三个任务,不能获取其他任务的返回结果,没有返回值 acceptEither():当两个任务其中一个执行完成之后,就执行第三个任务,可以获取其他任务的返回结果,没有返回值 acceptEither():当两个任务其中一个执行完成之后,就执行第三个任务,可以获取其他任务的返回结果,有返回值

多任务组合

CompletableFuture.allOf(future, future1):等待所有的任务执行完成 CompletableFuture.anyOf():只要有一个任务执行完就结束

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println("主线程启动---"+ LocalDateTime.now());

CompletableFuture future = CompletableFuture.runAsync(() -> {

System.out.println("任务一执行完成");

}, executor);

CompletableFuture future1 = CompletableFuture.runAsync(() -> {

try {

Thread.sleep(3000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("任务二执行完成");

}, executor);

CompletableFuture allOf = CompletableFuture.allOf(future, future1);

allOf.get();//等待所有任务执行完

System.out.println("主线程结束---"+ LocalDateTime.now());

}

优惠劵

qq_43659061

关注

关注

0

点赞

2

收藏

觉得还不错?

一键收藏

知道了

0

评论

JAVA 多线程、CompleableFuture异步编程

初始化线程的四种办法继承Thread类实现Rannable 接口实现callable 接口 + FutureTask (可以获取处理结果和处理异常)线程池继承Thread实现public class ThreadTest { public static void main(String[] args) { System.out.println("主线程启动"); Thread1 thread1 = new Thread1(); thre

复制链接

扫一扫

主线程等待子线程结束代码

10-14

我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题.

现在我解决了这个问题,把代码共享出来供大家参考.

代码中有注释和注意事项,相信大家看过后就会觉得非常简单.

Java8 CompletableFuture底层实现及使用详解

程序员野蛮成长

07-14

586

该方法的区别在于,它将任务串联起来,可以实现多个异步操作的链式调用。然后,通过thenApply方法将该CompletableFuture对象转换为一个新的CompletableFuture对象,用于异步执行一个返回整数类型的任务,转换函数是将字符串长度作为结果返回。thenCompose方法接收一个Function类型的参数,该函数用于将一个CompletableFuture对象的结果作为下一个CompletableFuture对象的输入,并返回一个新的CompletableFuture对象。

参与评论

您还未登录,请先

登录

后发表或查看评论

Java CompletableFuture 详解

橙子wj的博客

05-21

2605

出处:

http://colobu.com/2016/02/29/Java-CompletableFuture/Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不

Java8特性 - CompletableFuture的基础使用

Zong_0915的博客

10-19

1137

Java8特性 - CompletableFuture的基础使用

Qt之QThread介绍(常用接口及实现、自动释放内存、关闭窗口时停止线程运行、同步互斥)

热门推荐

yky的博客

08-09

1万+

在程序设计中,为了不影响主程序的执行,常常把耗时操作放到一个单独的线程中执行。Qt对多线程操作有着完整的支持,Qt中通过继承QThread并重写run()方法的方式实现多线程代码的编写。针对线程之间的同步与互斥问题,Qt还提供了QMutex、QReadWriteLock、QwaitCondition、QSemaphore等多个类来实现。

本篇博客将针对以下几个方面进行讲解

[1]QThread...

Java8 新特性 Completablefuture 学习与使用

Monster的博客

12-07

619

使用competablefuture进行线程的管理

QThread的用法

顺其自然~专栏

07-07

8032

QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。QThread的使用方法有如下两种:下面通过具体的方法描述和例子来介绍两种方法。 首先新建一个worker类,该类重点在于其doWork槽

多线程中的Join

柯基的博客

09-16

2455

线程中join(强制执行):当前线程执行完毕之后,才会执行后面程序,其他线程阻塞;

实例:

public class ThreadJoin implements Runnable{

@Override

public void run() {

for (int i = 1; i < 1000; i++) {

System.out.println("Join..."+i+"运行中");

}

}

public stat

Qt线程QThread详解

北极星的技术笔记

02-20

4659

在程序中使用线程可以提高程序的性能、并发性、响应性和稳定性,使得程序设计更加灵活和简单。但是,线程编程也有一些挑战,如线程安全性和死锁等问题需要格外注意。我们使用QT框架编程时,可以用框架提供的线程类QThread来管理线程。本文将介绍使用QThread编程时的两种方式,并给出一个数据同步的示例。在介绍QThread之前先复习下线程的定义,线程是操作系统中的基本执行单元,是一个独立的执行路径。每个线程都有自己的栈空间,用于存储本地变量和函数调用的上下文。

最详细的Qt多线程的三种方法之一QThread

zy1024的博客

07-30

4568

一、多线程目的

QThread类提供了一个与平台无关的管理线程的方法。

在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,比如大量运算,复制大文件,网络传输等。

二、Qt多线程使用方法

使用Qt框架开发应用程序时,使用QThread类可以方便快捷地创建管理多线程。

而多线程之间的通信也可使用Qt特有的“信号-槽”机制实现。

QThread的使用方法有如下两种:

1. 继承QThread类

2. QObject::moveToThread()

2.1 继承QThread方法

第一种方法很简

Java多线程编程总结

01-31

下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多的内容,因此建议大家看上面的系列文章的内容,与时俱进,跟上Java发展的步伐。要认识多线程就要从操作系统...

Java多线程实现异步调用实例

09-18

Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。

Java多线程编程的优点和缺点

10-16

支持并发编程:多线程编程是支持并发编程的基础,可以处理多个并发任务,如服务器处理多个客户端请求。 缺点: 竞态条件(Race Conditions):多个线程访问共享资源时可能引发竞态条件,导致数据不一致性和程序错误...

Java语言多线程编程讲义

09-14

Java语言多线程编程讲义

LeetCode hot100-4

alike_meng的博客

03-04

472

LeetCode热题100第4题

Java自学day4

nanshenchao的博客

03-03

1199

数字进行运算时,数据类型不一样不能运算,需要一样的,才能运算。类型转换的分类:1.隐式转换(自动类型提升):取值范围小的数值转向取值范围大的数值2.强制转换:取值范围大的数值转向取值范围小的数值如果把一个取值范围大的数值,赋值给取值范围小的变量。是不允许直接赋值的。如果一定要这么做就需要加入强制转换格式:目标数据类型 变量名 = (目标数据类型)被强转的数据;

【Web】浅聊JDBC的SPI机制是怎么实现的——DriverManager

最新发布

uuzeray的博客

03-06

955

【Web】浅浅地聊JDBC java.sql.Driver的SPI后门-CSDN博客上篇文章我们做到了知其然,知道了JDBC有SPI机制,并且可以利用其Driver后门这篇文章希望可以做到知其所以然,对JDBC的SPI机制的来源做到心里有数。

java-初级项目实战-(swing篇)-羊了个羊(动态交互,)

qq_61549190的博客

03-04

463

判断t方格是否压住b方格,就要保证t方格的左上的黑点始终在蓝框内。即t的 x坐标(x1,x2)之间,y(y1,y2)之间。将下方图片添加到一个盒子中(简单的添加)添加一个新的集合,用于存储下方的图片。蓝框为b方格的宽度和高度的2倍,x1的x即为b的左上点x-其宽度。y1的y即为b的左上点y-其高度。y2的y即为b的左上点y+其高度。x2的x即为b左上点x+其宽度。t方格的黑点设置为(x,y)先检测2张牌是否压住。

面试 Java 基础八股文十问十答第十五期

qq_67358181的博客

03-05

936

面试必备八股文!内容包含:Java基础、Java框架、Git命令、JVM、多线程、消息队列、微服务、Linux、数据库、Redis缓存、算法、Vue、React、前端性能优化等八股文。

Java多线程和异步线程区别

05-30

Java多线程和异步线程有一些共同点,但也有一些区别。

Java多线程是指在同一进程内创建多个线程,这些线程可以并发执行,以提高程序的执行效率。Java多线程可以使用Thread类或者Runnable接口实现,也可以使用线程池等方式管理线程。多线程适用于需要同时执行多个任务或者需要在后台执行复杂的计算任务的场景。

异步线程是指一种特殊的线程,它不会阻塞程序的执行,而是在后台执行一些耗时的操作,例如网络请求、IO操作等,以提高程序的响应速度和用户体验。Java中实现异步线程可以使用Future、CompletableFuture等类,也可以使用回调函数等方式实现。异步线程适用于需要进行耗时操作但不希望阻塞主线程的场景。

在使用多线程和异步线程时,需要考虑线程安全、数据一致性等问题,以避免出现不可预期的问题。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

qq_43659061

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

5

原创

34万+

周排名

89万+

总排名

8285

访问

等级

80

积分

3

粉丝

15

获赞

5

评论

43

收藏

私信

关注

热门文章

springBoot集成redis实现点赞阅读统计、并针对用户去重

3722

Linux中自定义shell脚本启动jar包

2445

JAVA 多线程、CompleableFuture异步编程

918

Linux安装RabbitMQ消息队列

650

SpringBoot集成RabbitMQ消息中间件实现

550

最新评论

Linux中自定义shell脚本启动jar包

Java劝退师、:

写的好好哦,很nice! 最近我也在学习写博客,有空来看看我呀,一起互相学习。期待你的关注与支持

Linux中自定义shell脚本启动jar包

strive_day:

看懂了,看懂了,非常详细,详细博主!

Linux中自定义shell脚本启动jar包

ITKaven:

感谢博主分享,学到不少东西!

Linux中自定义shell脚本启动jar包

qq_43659061:

谢谢!

Linux中自定义shell脚本启动jar包

从零开始的数据猿:

活到老学到老,支持原创!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

SpringBoot集成RabbitMQ消息中间件实现

Linux安装RabbitMQ消息队列

springBoot集成redis实现点赞阅读统计、并针对用户去重

2021年5篇

目录

目录

最新文章

SpringBoot集成RabbitMQ消息中间件实现

Linux安装RabbitMQ消息队列

springBoot集成redis实现点赞阅读统计、并针对用户去重

2021年5篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

comp(计算机命令)_百度百科

(计算机命令)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心COMP是一个多义词,请在下列义项上选择浏览(共3个义项)添加义项收藏查看我的收藏0有用+10comp播报讨论上传视频计算机命令Comp逐字节地比较两个文件或几组文件的内容。Comp 可以比较相同驱动器或不同驱动器上的文件以及相同目录或不同目录中的文件。comp 比较文件时,它将显示文件的位置和文件名。如果在不含参数的情况下使用,则 comp 提示输入要进行比较的文件。外文名comp属    性计算机命令目录1语法2参数3注释▪比较相同名称的文件▪data1 和 data2 的特殊情形▪comp 命令如何标识不匹配信息▪按顺序比较文件4范例语法播报编辑comp [data1] [data2] [/d] [/a] [/l] [/n=number] [/c]参数播报编辑data1指定要比较的第一个文件或文件集的位置和名称。使用通配字符(* 和 ?)可以指定多个文件。data2指定要比较的第二个文件或文件集的位置和名称。使用通配字符(* 和 ?)可以指定多个文件。/d用十进制格式显示差别。(默认格式为十六进制。)/a将差别显示为字符形式。/l显示出现差别的行编号,而不显示字节偏量。/n=number比较两个文件的第一个 number,即使两个文件的大小并不相同。/c执行不区分大小写的比较。/off[line]处理设置了脱机属性的文件。/?在命令提示符显示帮助。 [1]注释播报编辑比较相同名称的文件如果要比较的文件位于不同的目录或不同的驱动器,则它们可以有相同的文件名。如果不为 data2 指定文件名,则 data2 的默认文件名与 data1 中的文件名相同。可以使用通配字符(* 和 ?)来指定文件名。data1 和 data2 的特殊情形如果省略 data1 或 data2 的必要组件或者省略 data2,comp 将提示您输入缺少的信息。如果 data1 只包含驱动器号或没有文件名的目录名,则 comp 将对指定目录中的所有文件和 data2 中指定的文件进行比较。如果 data2 只包含驱动器号或目录名,则 data2 的默认文件名与 data1 中的相同。comp 命令如何标识不匹配信息在比较期间,comp 会显示消息,标识两个文件中不同信息的位置。每条消息都表明了不相等字节的偏移内存地址和字节本身的内容(除非指定了 /a 或 /d 命令行选项,否则都用十六进制记数法表示)。消息按以下格式显示: [1]Compare error at OFFSET xxxxxxxx

file1 = xx

file2 = xx经过 10 个不相等的比较后,comp 命令终止了文件对比并显示出下列信息:10 Mismatches - ending compare

Comparing files of different sizes除非指定 /n 命令行选项,否则不能比较不同大小的文件。如果文件大小不同,comp 将显示下列消息:Files are different sizes

Compare more files (Y/N)?按 Y 比较其他文件对。按 N 停止 comp 命令。如果按 Y 来响应提示,则 comp 在其所作的每个比较中都将使用在命令行中指定的任意命令行选项,直到按下 N 或重新键入命令。在比较不同大小的文件时,使用 /n 命令行选项将仅比较每个文件的第一部分。按顺序比较文件如果使用通配符(* 和 ?)指定多个文件,comp 查找与 data1 匹配的第一个文件,并将它与 data2 中的相应文件(如果有的话)进行比较。comp 命令报告比较结果,然后对每个匹配 data1 的文件进行相同的操作。完成后,comp 显示下列消息:Compare more files (Y/N)?要比较其他文件,请按 Y。comp 命令提示符您键入新文件的位置和名称。要停止比较,请按 N。当按下 Y 时,comp 将提示您输入要使用的命令行选项。如果未指定任何命令行选项,comp 将使用以前指定的命令行选项。如果 comp 无法找到文件,将使用消息提示您决定是否要比较其他文件。范例播报编辑要将目录 C:\Reports 的内容与备份目录\\Sales\Backup\April进行比较,请键入:comp c:\reports\\sales\backup\april要比较 \Invoice 目录中文本文件的开头 10 行并以十进制格式显示结果,请键入:comp \invoice\*.txt \invoice\backup\*.txt /n=10 /d新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

comp是什么意思_comp的翻译_音标_读音_用法_例句_爱词霸在线词典

是什么意思_comp的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录comp是什么意思_comp用英语怎么说_comp的翻译_comp翻译成_comp的中文意思_comp怎么读,comp的读音,comp的用法,comp的例句翻译人工翻译试试人工翻译翻译全文comp英 [kɒmp]美 [kɑmp]释义n.补偿,赔偿; 赠品大小写变形:COMPCoMPComp点击 人工翻译,了解更多 人工释义词态变化复数: comps;实用场景例句全部Her children go to the local comp.她的孩子们上当地的综合中学。《牛津高阶英汉双解词典》In the matter of " comp'ny " Mammy was equally adamant.嬷嬷 在住宿方面的态度也一样坚决.飘(部分)D - COMP possesses both evaluative and statistical functions.comp具有测评和统计双重功能.互联网The chemotherapy regimen consisted of 2~8 cycles of COP, COMP, CHOP or BACOP regimen.放疗前、中、后行COP 、 comp 、 CHOP、BACOP方案化疗2~8个疗程.互联网Traditionally , the largest set of newsgroups has been the computer - related ones under the hierarchy comp.历来最大的一组专题组是comp级下的与计算机有关的专题组.互联网Qu é saben lo que es tango , qu é saben de comp á s!什么叫神气活现, 削瘦的时尚男女最懂!互联网Sticking pipe has been being a comp 1 icated problem in drilling this area.在这个地区打井卡钻一直是个复杂问题.互联网I work for an IT comp any. I'm a consultant.在一家IT公司工作, 是一名顾问.互联网COMP Compares the contents of two files or sets of files.比较两个或两组档的内容.互联网He peered at the comp - uter screen, wondering what his programming mistake was.他仔细地看着计算机的显示屏, 想知道他的程序出了什么错.互联网Lors de ces 29è me Olympiades, la comp é tition s'annonce particuli è rement disput é e.第29奥运会上的竞争会更为激烈.互联网Comp : I have never seen such a wonderful park before.我从来未看见过这样漂亮的公园.互联网The major comp lications encountered were cataract, corneal scar and glaucoma.并发症主要包括白内障 、 角膜疤痕、青光眼.互联网Comp : Tom did not speak a single word.汤姆一句话也不说.互联网Ainsi, nous deviendrons plus comp é titifs, plus innovants.这样我们才会最具竞争力, 最具创造力.互联网收起实用场景例句释义词态变化实用场

COMP中文(繁體)翻譯:劍橋詞典

COMP中文(繁體)翻譯:劍橋詞典

詞典

翻譯

文法

同義詞詞典

+Plus

劍橋詞典+Plus

Shop

劍橋詞典+Plus

我的主頁

+Plus 幫助

退出

劍橋詞典+Plus

我的主頁

+Plus 幫助

退出

登錄

/

註冊

正體中文 (繁體)

查找

查找

英語-中文(繁體)

comp 在英語-中文(繁體)詞典中的翻譯

compverb [ T ] mainly US informal uk

Your browser doesn't support HTML5 audio

/kɒmp/ us

Your browser doesn't support HTML5 audio

/kɑːmp/

Add to word list

Add to word list

to give someone something valuable without asking for payment

饋贈,贈送

Usually, the writer's entire trip is comped.

一般來說作者全部旅程的費用都是全包的。

They comped us two tickets.

他們贈送我們兩張票。

comped meals/drinks

饋贈的飯/飲料

to allow someone to do something without having to pay

讓…不花錢(做某件事)

You can comp two guests.

你可以免費帶兩個客人來。

(comp在劍橋英語-中文(繁體)詞典的翻譯 © Cambridge University Press)

comp的例句

comp

During a drum solo the pianist sometimes comps, often using a predictable pattern of rhythmically-played chords called hits.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

High rollers often receive lavish comps from casinos to lure them onto the gambling floors, such as free private jet transfers, limousine use and use of the casinos' best suites.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

There was a number of reasons for the school to be the first comp.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

The comp works by diverting gases at the muzzle.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

Casinos are permitted to give away comp drinks, and many do to reward and encourage gambling.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

We also prove that it is equivalent to 1 for a class of programs involving tautologies, which we will define as tau-comp.

來自 Cambridge English Corpus

The amount of comps that a player is given usually depends on what game they play, how much they bet, and how long they play.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

An artists proof is also known as a comp or complimentary if given to printers.

來自 Wikipedia

該例句來自維基百科,在CC BY-SA許可下可重複使用。

示例中的觀點不代表劍橋詞典編輯、劍橋大學出版社和其許可證頒發者的觀點。

C1

comp的翻譯

中文(簡體)

馈赠,赠送, 让…不花钱(做某件事)…

查看更多內容

西班牙語

forma abreviada de "competition":, competición, concurso…

查看更多內容

葡萄牙語

oferecer como cortesia, compensação, remuneração…

查看更多內容

需要一個翻譯器嗎?

獲得快速、免費的翻譯!

翻譯器工具

comp的發音是什麼?

在英語詞典中查看 comp 的釋義

瀏覽

Comoran

comorbid

comorbidity

Comoros

comp

comp time

compact

compact disc

compaction

comp更多的中文(繁體)翻譯

全部

comp time

fully comp

comp time, at compensatory time

查看全部意思»

「每日一詞」

veggie burger

UK

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɜː.ɡər/

US

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɝː.ɡɚ/

a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape

關於這個

部落格

Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)

March 06, 2024

查看更多

新詞

stochastic parrot

March 04, 2024

查看更多

已添加至 list

回到頁面頂端

內容

英語-中文(繁體)例句翻譯

©劍橋大學出版社與評估2024

學習

學習

學習

新詞

幫助

紙本出版

Word of the Year 2021

Word of the Year 2022

Word of the Year 2023

開發

開發

開發

詞典API

連按兩下查看

搜尋Widgets

執照資料

關於

關於

關於

無障礙閱讀

劍橋英語教學

劍橋大學出版社與評估

授權管理

Cookies與隱私保護

語料庫

使用條款

京ICP备14002226号-2

©劍橋大學出版社與評估2024

劍橋詞典+Plus

我的主頁

+Plus 幫助

退出

詞典

定義

清晰解釋自然的書面和口頭英語

英語

學習詞典

基礎英式英語

基礎美式英語

翻譯

點選箭頭改變翻譯方向。

雙語詞典

英語-中文(簡體)

Chinese (Simplified)–English

英語-中文(繁體)

Chinese (Traditional)–English

英語-荷蘭文

荷蘭語-英語

英語-法語

法語-英語

英語-德語

德語-英語

英語-印尼語

印尼語-英語

英語-義大利語

義大利語-英語

英語-日語

日語-英語

英語-挪威語

挪威語-英語

英語-波蘭語

波蘭語-英語

英語-葡萄牙語

葡萄牙語-英語

英語-西班牙語

西班牙語-英語

English–Swedish

Swedish–English

半雙語詞典

英語-阿拉伯語

英語-孟加拉文

英語-加泰羅尼亞語

英語-捷克語

英語-丹麥語

English–Gujarati

英語-印地語

英語-韓語

英語-馬來語

英語-馬拉地語

英語-俄語

English–Tamil

English–Telugu

英語-泰語

英語-土耳其語

英語-烏克蘭文

English–Urdu

英語-越南語

翻譯

文法

同義詞詞典

Pronunciation

劍橋詞典+Plus

Shop

劍橋詞典+Plus

我的主頁

+Plus 幫助

退出

登錄 /

註冊

正體中文 (繁體)  

Change

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

關注我們!

選擇一本詞典

最近的詞和建議

定義

清晰解釋自然的書面和口頭英語

英語

學習詞典

基礎英式英語

基礎美式英語

文法與同義詞詞典

對自然書面和口頭英語用法的解釋

英語文法

同義詞詞典

Pronunciation

British and American pronunciations with audio

English Pronunciation

翻譯

點選箭頭改變翻譯方向。

雙語詞典

英語-中文(簡體)

Chinese (Simplified)–English

英語-中文(繁體)

Chinese (Traditional)–English

英語-荷蘭文

荷蘭語-英語

英語-法語

法語-英語

英語-德語

德語-英語

英語-印尼語

印尼語-英語

英語-義大利語

義大利語-英語

英語-日語

日語-英語

英語-挪威語

挪威語-英語

英語-波蘭語

波蘭語-英語

英語-葡萄牙語

葡萄牙語-英語

英語-西班牙語

西班牙語-英語

English–Swedish

Swedish–English

半雙語詞典

英語-阿拉伯語

英語-孟加拉文

英語-加泰羅尼亞語

英語-捷克語

英語-丹麥語

English–Gujarati

英語-印地語

英語-韓語

英語-馬來語

英語-馬拉地語

英語-俄語

English–Tamil

English–Telugu

英語-泰語

英語-土耳其語

英語-烏克蘭文

English–Urdu

英語-越南語

詞典+Plus

詞彙表

選擇語言

正體中文 (繁體)  

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

內容

英語-中文(繁體) 

 Verb

例句

Translations

文法

所有翻譯

我的詞彙表

把comp添加到下面的一個詞彙表中,或者創建一個新詞彙表。

更多詞彙表

前往詞彙表

對該例句有想法嗎?

例句中的單詞與輸入詞條不匹配。

該例句含有令人反感的內容。

取消

提交

例句中的單詞與輸入詞條不匹配。

該例句含有令人反感的內容。

取消

提交

数学竞赛 - 中国数学会

中文

English

手机站

回到旧版

登录

入会申请

首 页

关于学会

数学会简介

数学会章程

监事会条例

学会档案

组织机构

省市数学会

联系我们

历年年会

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

新闻资讯

学会新闻

科学新闻

数学会议信息

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

学会党建

通知公告

组织成员

党建动态

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

分支机构

机构文档

工作委员会

专业分会

新闻动态

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

学会奖项

华罗庚奖

陈省身奖

钟家庆奖

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

数学竞赛

新闻动态

全国高中数学联赛

全国中学生数学冬令营

国际数学奥林匹克中国队

中国女子数学奥林匹克

全国大学生数学竞赛

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

数学中心

丝路数学中心

新闻动态

学术活动

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

会员专区

会员条例

会员登陆

入会申请

数学会工作信息

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

科学战役

新闻报道及通报

研究成果摘选

中国数学会是中国数学工作者的学术性法人社会团体,是中国科学技术协会的组成部分。中国数学会的宗旨是团结广大数学工作者,为促进数学的发展,繁荣我国的科学技术事业,促进科学技术人才的成长与提高...

关于公布第十五届全国大学生数学竞赛初赛获奖名单的通知

分享到:

发布时间:2023-12-27

盖章版-关于公布第十五届全国大学生数学竞赛初赛获奖名单的通知.pdf各赛区初赛获奖名单.zip

返回主页

数学竞赛

新闻动态

全国高中数学联赛

全国中学生数学冬令营

国际数学奥林匹克中国队

中国女子数学奥林匹克

全国大学生数学竞赛

最新动态

袁亚湘委员:切实减轻青年科技人员负担

03-06

两会院士说|方复全:发展新质生产力,需要“蜜蜂式”人才

03-06

张平文 | 关于数学学科高层次人才培养的思考

02-28

周向宇院士:《愚公移山》新解

01-29

周向宇院士:中国古代数学的成就

01-25

2024年数学界迎新春茶话会顺利召开

01-23

中国数学会2023年学术年会在辽宁省大连市隆重召开

01-15

数学会奖项

华罗庚奖

华罗庚先生是我国著名数学家

华罗庚先生是我国著名数学家,他热爱祖国,献身科学事业,一生为发展我国的数学事业和培养人才做出了卓越贡献。

陈省身奖

陈省身教授是一位国际数学大师

国际数学大师陈省身教授是美籍华裔数学家、中国科学院外籍院士。他非常关心祖国数学事业的发展,几十年来在发展我国数学事业、培养数学人才等方面做了大量工作。

钟家庆奖

钟家庆教授生前对祖国数学事业的发展极其关切

钟家庆教授生前对祖国数学事业的发展极其关注,并为之拚搏一生。为了纪念并实现他发展祖国数学事业的遗愿,数学界有关人士于1987年共同筹办了钟家庆基金,并设立了钟家庆数学奖,委托中国数学会承办。

关注微信

扫描二维码关注

关于学会

数学会简介

数学会章程

监事会条例

学会档案

组织机构

省市数学会

联系我们

历年年会

新闻资讯

学会新闻

科学新闻

数学会议信息

学会党建

通知公告

组织成员

党建动态

分支机构

机构文档

工作委员会

专业分会

新闻动态

学会奖项

华罗庚奖

陈省身奖

钟家庆奖

数学竞赛

新闻动态

全国高中数学联赛

全国中学生数学冬令营

国际数学奥林匹克中国队

中国女子数学奥林匹克

全国大学生数学竞赛

联系我们

电话: +86-10-82541197

邮箱:cms@math.ac.cn

地址:北京市海淀区中关村东路55号

京ICP备17012431号-1   京公网安备 110402430128号 版权所有:中国数学会 

法律法规

| OA/ERP系统

技术支持:神州互动

Java 8 的异步编程利器 CompletableFuture 详解_java8 completablefuture-CSDN博客

>

Java 8 的异步编程利器 CompletableFuture 详解_java8 completablefuture-CSDN博客

Java 8 的异步编程利器 CompletableFuture 详解

ThinkWon

已于 2022-03-09 23:34:13 修改

阅读量4.3k

收藏

89

点赞数

21

分类专栏:

并发编程

文章标签:

异步编程利器

Java 8 的异步编程利器

于 2022-03-09 23:32:24 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ThinkWon/article/details/123390393

版权

并发编程

专栏收录该内容

33 篇文章

127 订阅

订阅专栏

文章目录

一个例子回顾 Future一个例子走进CompletableFutureCompletableFuture使用场景创建异步任务supplyAsync方法runAsync方法

任务异步回调1. thenRun/thenRunAsync2.thenAccept/thenAcceptAsync3. thenApply/thenApplyAsync4. exceptionally5. whenComplete方法6. handle方法

多个任务组合处理AND组合关系OR组合的关系AllOfAnyOfthenCompose

CompletableFuture使用有哪些注意点1. Future需要获取返回值,才能获取异常信息2. CompletableFuture的get()方法是阻塞的3. 默认线程池的注意点4. 自定义线程池时,注意饱和策略

最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture

一个例子回顾 Future

因为CompletableFuture实现了Future接口,我们先来回顾Future吧

Future是Java5新加的一个接口,它提供了一种异步并行计算的功能。如果主线程需要执行一个很耗时的计算任务,我们就可以通过future把这个任务放到异步线程中执行。主线程继续处理其他任务,异步线程处理完成后,再通过Future获取计算结果

来看个简单例子吧,假设我们有两个任务服务,一个查询用户基本信息,一个是查询用户勋章信息。如下

public class UserInfoService {

public UserInfo getUserInfo(Long userId) throws InterruptedException {

Thread.sleep(300);//模拟调用耗时

return new UserInfo("666", "技术人成长之路", 27); //一般是查数据库,或者远程调用返回的

}

}

public class MedalService {

public MedalInfo getMedalInfo(long userId) throws InterruptedException {

Thread.sleep(500); //模拟调用耗时

return new MedalInfo("666", "守护勋章");

}

}

接下来,我们来演示下,在主线程中是如何使用Future来进行异步调用的。

public class FutureTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

ExecutorService executorService = Executors.newFixedThreadPool(10);

UserInfoService userInfoService = new UserInfoService();

MedalService medalService = new MedalService();

long userId =666L;

long startTime = System.currentTimeMillis();

//调用用户服务获取用户基本信息

FutureTask userInfoFutureTask = new FutureTask<>(new Callable() {

@Override

public UserInfo call() throws Exception {

return userInfoService.getUserInfo(userId);

}

});

executorService.submit(userInfoFutureTask);

Thread.sleep(300); //模拟主线程其它操作耗时

FutureTask medalInfoFutureTask = new FutureTask<>(new Callable() {

@Override

public MedalInfo call() throws Exception {

return medalService.getMedalInfo(userId);

}

});

executorService.submit(medalInfoFutureTask);

UserInfo userInfo = userInfoFutureTask.get();//获取个人信息结果

MedalInfo medalInfo = medalInfoFutureTask.get();//获取勋章信息结果

System.out.println("总共用时" + (System.currentTimeMillis() - startTime) + "ms");

}

}

运行结果:

总共用时806ms

如果我们不使用Future进行并行异步调用,而是在主线程串行进行的话,耗时大约为300+500+300 = 1100 ms。可以发现,future+线程池异步配合,提高了程序的执行效率。

但是Future对于结果的获取,不是很友好,只能通过阻塞或者轮询的方式得到任务的结果。

Future.get() 就是阻塞调用,在线程获取结果之前get方法会一直阻塞。Future提供了一个isDone方法,可以在程序中轮询这个方法查询执行结果。

阻塞的方式和异步编程的设计理念相违背,而轮询的方式会耗费无谓的CPU资源。因此,JDK8设计出CompletableFuture。CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。

一个例子走进CompletableFuture

我们还是基于以上Future的例子,改用CompletableFuture 来实现

public class FutureTest {

public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {

UserInfoService userInfoService = new UserInfoService();

MedalService medalService = new MedalService();

long userId =666L;

long startTime = System.currentTimeMillis();

//调用用户服务获取用户基本信息

CompletableFuture completableUserInfoFuture = CompletableFuture.supplyAsync(() -> userInfoService.getUserInfo(userId));

Thread.sleep(300); //模拟主线程其它操作耗时

CompletableFuture completableMedalInfoFuture = CompletableFuture.supplyAsync(() -> medalService.getMedalInfo(userId));

UserInfo userInfo = completableUserInfoFuture.get(2,TimeUnit.SECONDS);//获取个人信息结果

MedalInfo medalInfo = completableMedalInfoFuture.get();//获取勋章信息结果

System.out.println("总共用时" + (System.currentTimeMillis() - startTime) + "ms");

}

}

可以发现,使用CompletableFuture,代码简洁了很多。CompletableFuture的supplyAsync方法,提供了异步执行的功能,线程池也不用单独创建了。实际上,它CompletableFuture使用了默认线程池是ForkJoinPool.commonPool。

CompletableFuture提供了几十种方法,辅助我们的异步任务场景。这些方法包括创建异步任务、任务异步回调、多个任务组合处理等方面。我们一起来学习吧

CompletableFuture使用场景

创建异步任务

CompletableFuture创建异步任务,一般有supplyAsync和runAsync两个方法

创建异步任务

supplyAsync执行CompletableFuture任务,支持返回值runAsync执行CompletableFuture任务,没有返回值。

supplyAsync方法

//使用默认内置线程池ForkJoinPool.commonPool(),根据supplier构建执行任务

public static CompletableFuture supplyAsync(Supplier supplier)

//自定义线程,根据supplier构建执行任务

public static CompletableFuture supplyAsync(Supplier supplier, Executor executor)

runAsync方法

//使用默认内置线程池ForkJoinPool.commonPool(),根据runnable构建执行任务

public static CompletableFuture runAsync(Runnable runnable)

//自定义线程,根据runnable构建执行任务

public static CompletableFuture runAsync(Runnable runnable, Executor executor)

实例代码如下:

public class FutureTest {

public static void main(String[] args) {

//可以自定义线程池

ExecutorService executor = Executors.newCachedThreadPool();

//runAsync的使用

CompletableFuture runFuture = CompletableFuture.runAsync(() -> System.out.println("run,技术人成长之路"), executor);

//supplyAsync的使用

CompletableFuture supplyFuture = CompletableFuture.supplyAsync(() -> {

System.out.print("supply,技术人成长之路");

return "技术人成长之路"; }, executor);

//runAsync的future没有返回值,输出null

System.out.println(runFuture.join());

//supplyAsync的future,有返回值

System.out.println(supplyFuture.join());

executor.shutdown(); // 线程池需要关闭

}

}

//输出

run,技术人成长之路

null

supply,技术人成长之路技术人成长之路

任务异步回调

1. thenRun/thenRunAsync

public CompletableFuture thenRun(Runnable action);

public CompletableFuture thenRunAsync(Runnable action);

CompletableFuture的thenRun方法,通俗点讲就是,做完第一个任务后,再做第二个任务。某个任务执行完成后,执行回调方法;但是前后两个任务没有参数传递,第二个任务也没有返回值

public class FutureThenRunTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("先执行第一个CompletableFuture方法任务");

return "技术人成长之路";

}

);

CompletableFuture thenRunFuture = orgFuture.thenRun(() -> {

System.out.println("接着执行第二个任务");

});

System.out.println(thenRunFuture.get());

}

}

//输出

先执行第一个CompletableFuture方法任务

接着执行第二个任务

null

thenRun 和 thenRunAsync 有什么区别呢?可以看下源码哈:

private static final Executor asyncPool = useCommonPool ?

ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();

public CompletableFuture thenRun(Runnable action) {

return uniRunStage(null, action);

}

public CompletableFuture thenRunAsync(Runnable action) {

return uniRunStage(asyncPool, action);

}

如果你执行第一个任务的时候,传入了一个自定义线程池:

调用thenRun方法执行第二个任务时,则第二个任务和第一个任务是共用同一个线程池。调用thenRunAsync方法执行第二个任务时,则第一个任务使用的是你自己传入的线程池,第二个任务使用的是ForkJoin线程池

TIPS:后面介绍的thenAccept和thenAcceptAsync,thenApply和thenApplyAsync等,它们之间的区别也是这个哈。

2.thenAccept/thenAcceptAsync

CompletableFuture的thenAccept方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将第一个任务的执行结果,作为第二个任务的入参,传递到回调方法中,但是回调方法是没有返回值的。

public class FutureThenAcceptTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("原始CompletableFuture方法任务");

return "技术人成长之路";

}

);

CompletableFuture thenAcceptFuture = orgFuture.thenAccept((a) -> {

if ("技术人成长之路".equals(a)) {

System.out.println("关注了");

}

System.out.println("先考虑考虑");

});

System.out.println(thenAcceptFuture.get());

}

}

3. thenApply/thenApplyAsync

CompletableFuture的thenApply方法表示,第一个任务执行完成后,执行第二个回调方法任务,会将第一个任务的执行结果,作为第二个任务的入参,传递到回调方法中,并且回调方法是有返回值的。

public class FutureThenApplyTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("原始CompletableFuture方法任务");

return "技术人成长之路";

}

);

CompletableFuture thenApplyFuture = orgFuture.thenApply((a) -> {

if ("技术人成长之路".equals(a)) {

return "关注了";

}

return "先考虑考虑";

});

System.out.println(thenApplyFuture.get());

}

}

//输出

原始CompletableFuture方法任务

关注了

4. exceptionally

CompletableFuture的exceptionally方法表示,某个任务执行异常时,执行的回调方法;并且有抛出异常作为参数,传递到回调方法。

public class FutureExceptionTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("当前线程名称:" + Thread.currentThread().getName());

throw new RuntimeException();

}

);

CompletableFuture exceptionFuture = orgFuture.exceptionally((e) -> {

e.printStackTrace();

return "你的程序异常啦";

});

System.out.println(exceptionFuture.get());

}

}

//输出

当前线程名称:ForkJoinPool.commonPool-worker-1

java.util.concurrent.CompletionException: java.lang.RuntimeException

at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)

at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)

at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)

at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)

at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)

at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)

at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)

at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Caused by: java.lang.RuntimeException

at cn.eovie.future.FutureWhenTest.lambda$main$0(FutureWhenTest.java:13)

at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)

... 5 more

你的程序异常啦

5. whenComplete方法

CompletableFuture的whenComplete方法表示,某个任务执行完成后,执行的回调方法,无返回值;并且whenComplete方法返回的CompletableFuture的result是上个任务的结果。

public class FutureWhenTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("当前线程名称:" + Thread.currentThread().getName());

try {

Thread.sleep(2000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "技术人成长之路";

}

);

CompletableFuture rstFuture = orgFuture.whenComplete((a, throwable) -> {

System.out.println("当前线程名称:" + Thread.currentThread().getName());

System.out.println("上个任务执行完啦,还把" + a + "传过来");

if ("技术人成长之路".equals(a)) {

System.out.println("666");

}

System.out.println("233333");

});

System.out.println(rstFuture.get());

}

}

//输出

当前线程名称:ForkJoinPool.commonPool-worker-1

当前线程名称:ForkJoinPool.commonPool-worker-1

上个任务执行完啦,还把技术人成长之路传过来

666

233333

技术人成长之路

6. handle方法

CompletableFuture的handle方法表示,某个任务执行完成后,执行回调方法,并且是有返回值的;并且handle方法返回的CompletableFuture的result是回调方法执行的结果。

public class FutureHandlerTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture orgFuture = CompletableFuture.supplyAsync(

()->{

System.out.println("当前线程名称:" + Thread.currentThread().getName());

try {

Thread.sleep(2000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "技术人成长之路";

}

);

CompletableFuture rstFuture = orgFuture.handle((a, throwable) -> {

System.out.println("上个任务执行完啦,还把" + a + "传过来");

if ("技术人成长之路".equals(a)) {

System.out.println("666");

return "关注了";

}

System.out.println("233333");

return null;

});

System.out.println(rstFuture.get());

}

}

//输出

当前线程名称:ForkJoinPool.commonPool-worker-1

上个任务执行完啦,还把技术人成长之路传过来

666

关注了

多个任务组合处理

AND组合关系

thenCombine / thenAcceptBoth / runAfterBoth都表示:将两个CompletableFuture组合起来,只有这两个都正常执行完了,才会执行某个任务。

区别在于:

thenCombine:会将两个任务的执行结果作为方法入参,传递到指定方法中,且有返回值thenAcceptBoth: 会将两个任务的执行结果作为方法入参,传递到指定方法中,且无返回值runAfterBoth:不会把执行结果当做方法入参,且没有返回值。

public class ThenCombineTest {

public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {

CompletableFuture first = CompletableFuture.completedFuture("第一个异步任务");

ExecutorService executor = Executors.newFixedThreadPool(10);

CompletableFuture future = CompletableFuture

//第二个异步任务

.supplyAsync(() -> "第二个异步任务", executor)

// (w, s) -> System.out.println(s) 是第三个任务

.thenCombineAsync(first, (s, w) -> {

System.out.println(w);

System.out.println(s);

return "两个异步任务的组合";

}, executor);

System.out.println(future.join());

executor.shutdown();

}

}

//输出

第一个异步任务

第二个异步任务

两个异步任务的组合

OR组合的关系

applyToEither / acceptEither / runAfterEither 都表示:将两个CompletableFuture组合起来,只要其中一个执行完了,就会执行某个任务。

区别在于:

applyToEither:会将已经执行完成的任务,作为方法入参,传递到指定方法中,且有返回值acceptEither: 会将已经执行完成的任务,作为方法入参,传递到指定方法中,且无返回值runAfterEither:不会把执行结果当做方法入参,且没有返回值。

public class AcceptEitherTest {

public static void main(String[] args) {

//第一个异步任务,休眠2秒,保证它执行晚点

CompletableFuture first = CompletableFuture.supplyAsync(()->{

try{

Thread.sleep(2000L);

System.out.println("执行完第一个异步任务");}

catch (Exception e){

return "第一个任务异常";

}

return "第一个异步任务";

});

ExecutorService executor = Executors.newSingleThreadExecutor();

CompletableFuture future = CompletableFuture

//第二个异步任务

.supplyAsync(() -> {

System.out.println("执行完第二个任务");

return "第二个任务";}

, executor)

//第三个任务

.acceptEitherAsync(first, System.out::println, executor);

executor.shutdown();

}

}

//输出

执行完第二个任务

第二个任务

AllOf

所有任务都执行完成后,才执行 allOf 返回的CompletableFuture。如果任意一个任务异常,allOf的CompletableFuture,执行get方法,会抛出异常

public class allOfFutureTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture a = CompletableFuture.runAsync(()->{

System.out.println("我执行完了");

});

CompletableFuture b = CompletableFuture.runAsync(() -> {

System.out.println("我也执行完了");

});

CompletableFuture allOfFuture = CompletableFuture.allOf(a, b).whenComplete((m,k)->{

System.out.println("finish");

});

}

}

//输出

我执行完了

我也执行完了

finish

AnyOf

任意一个任务执行完,就执行anyOf返回的CompletableFuture。如果执行的任务异常,anyOf的CompletableFuture,执行get方法,会抛出异常

public class AnyOfFutureTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture a = CompletableFuture.runAsync(()->{

try {

Thread.sleep(3000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("我执行完了");

});

CompletableFuture b = CompletableFuture.runAsync(() -> {

System.out.println("我也执行完了");

});

CompletableFuture anyOfFuture = CompletableFuture.anyOf(a, b).whenComplete((m,k)->{

System.out.println("finish");

// return "技术人成长之路";

});

anyOfFuture.join();

}

}

//输出

我也执行完了

finish

thenCompose

thenCompose方法会在某个任务执行完成后,将该任务的执行结果,作为方法入参,去执行指定的方法。该方法会返回一个新的CompletableFuture实例

如果该CompletableFuture实例的result不为null,则返回一个基于该result新的CompletableFuture实例;如果该CompletableFuture实例为null,然后就执行这个新任务

public class ThenComposeTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {

CompletableFuture f = CompletableFuture.completedFuture("第一个任务");

//第二个异步任务

ExecutorService executor = Executors.newSingleThreadExecutor();

CompletableFuture future = CompletableFuture

.supplyAsync(() -> "第二个任务", executor)

.thenComposeAsync(data -> {

System.out.println(data); return f; //使用第一个任务作为返回

}, executor);

System.out.println(future.join());

executor.shutdown();

}

}

//输出

第二个任务

第一个任务

CompletableFuture使用有哪些注意点

CompletableFuture 使我们的异步编程更加便利的、代码更加优雅的同时,我们也要关注下它,使用的一些注意点。

1. Future需要获取返回值,才能获取异常信息

ExecutorService executorService = new ThreadPoolExecutor(5, 10, 5L,

TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

int a = 0;

int b = 666;

int c = b / a;

return true;

},executorService).thenAccept(System.out::println);

//如果不加 get()方法这一行,看不到异常信息

//future.get();

Future需要获取返回值,才能获取到异常信息。如果不加 get()/join()方法,看不到异常信息。小伙伴们使用的时候,注意一下哈,考虑是否加try…catch…或者使用exceptionally方法。

2. CompletableFuture的get()方法是阻塞的

CompletableFuture的get()方法是阻塞的,如果使用它来获取异步调用的返回值,需要添加超时时间~

//反例

CompletableFuture.get();

//正例

CompletableFuture.get(5, TimeUnit.SECONDS);

3. 默认线程池的注意点

CompletableFuture代码中又使用了默认的线程池,处理的线程个数是电脑CPU核数-1。在大量请求过来的时候,处理逻辑复杂的话,响应会很慢。一般建议使用自定义线程池,优化线程池配置参数。

4. 自定义线程池时,注意饱和策略

CompletableFuture的get()方法是阻塞的,我们一般建议使用future.get(3, TimeUnit.SECONDS)。并且一般建议使用自定义线程池。

但是如果线程池拒绝策略是DiscardPolicy或者DiscardOldestPolicy,当线程池饱和时,会直接丢弃任务,不会抛弃异常。因此建议,CompletableFuture线程池策略最好使用AbortPolicy,然后耗时的异步线程,做好线程池隔离哈。

优惠劵

ThinkWon

关注

关注

21

点赞

89

收藏

觉得还不错?

一键收藏

知道了

4

评论

Java 8 的异步编程利器 CompletableFuture 详解

文章目录一个例子回顾 Future一个例子走进CompletableFutureCompletableFuture使用场景创建异步任务supplyAsync方法runAsync方法任务异步回调1. thenRun/thenRunAsync2.thenAccept/thenAcceptAsync3. thenApply/thenApplyAsync4. exceptionally5. whenComplete方法6. handle方法多个任务组合处理AND组合关系OR组合的关系AllOfAnyOfthenCo

复制链接

扫一扫

专栏目录

Java开发利器Myeclipse全面详解

01-09

Java开发利器Myeclipse全面详解

原创经典 Java程序员必备

CompletableFuture:Java异步编程利器.pptx.pptx

12-21

CompletableFuture的定义

CompletableFuture是Java 8中引入的一种新的Future,它是一种异步编程工具,可以用于处理异步任务的结果。

CompletableFuture的特性

CompletableFuture具有非阻塞性,可以在等待结果的同时执行其他任务,而且它支持链式调用,使代码更加简洁易读。

CompletableFuture的使用场景

CompletableFuture常用于需要处理异步任务的场景,如并发请求、数据处理等,它可以提高程序的运行效率和响应速度。

4 条评论

您还未登录,请先

登录

后发表或查看评论

java编程利器

07-18

编程利器,java编程利器轻量级版,实现快速开发

Java8 异步编程利器 CompletableFuture 详解(全网看这一篇就行)

Java知音

08-03

1416

点击关注公众号,实用技术文章及时了解一、简介1.1 概述我们知道Future的有局限性,它没法直接对多个任务进行链式、组合等处理,需要借助并发工具类才能完成,实现逻辑比较复杂。而CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,完美弥补了Future的局限性,同时Comp...

CompletableFuture在异常处理方面的一些常见问题和解决方案,建议牢记!

m0_73311735的博客

06-29

7180

CompletableFuture是Java 8引入的一个类,位于java.util.concurrent包下。它提供了一种方便的方式来进行异步编程,尤其是在处理一系列并发任务时非常有用。CompletableFuture支持链式调用和组合多个异步任务。我们可以通过调用各种方法来注册回调函数,在任务完成时获取结果或处理异常。CompletableFuture提供了强大的功能来处理异步编程中的结果和异常。然而,在处理异常时,我们需要注意一些常见的陷阱。

【JAVA8】CompletableFuture使用详解

胖虎儿的博客

08-22

1万+

CompletableFuture!让你的代码免受阻塞之苦!

灵活的使用`CompletableFuture`可以让我们感受java8的异步编程之美!

Java8 CompletableFuture(3)异常处理 exceptionally

热门推荐

Java Spring Elasticsearch

05-07

1万+

Java8 CompletableFuture exceptionally一、前言二、测试案例

一、前言

在写代码时,经常需要对异常进行处理,最常用的就是try catch。

在用CompletableFuture编写多线程时,如果需要处理异常,可以用exceptionally,它的作用相当于catch。

exceptionally的特点:

当出现异常时,会触发回调方法exceptionally

exceptionally中可指定默认返回结果,如果出现异常,则返回默认的返回结果

二、测试案例

publi

【Java8新特性--->异步处理】CompletableFuture

qq_52793248的博客

12-23

3232

【Java1.8新特性--->异步处理】ComplatableFuture

java8 CompletableFuture 详解

果酱 の 博客

05-29

3527

java8 CompletableFuture 详解

CompletableFuture详解~异常处理

小强快跑~~

02-28

8688

计算结果完成时的回调方法

当 CompletableFuture 的计算结果完成,或者抛出异常的时候,可以执行特定的 Action。主要是下面的方法:

public CompletableFuture whenComplete(BiConsumer action)

public CompletableFuture whenCompleteAsync(BiConsumer

java 多线程 submit future.get方法阻塞问题的解决,实现按照任务完成的先后顺序获取任务的结果

You can walk as far as you want.

02-03

4131

1、Future

Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。

Future提供了三种功能:

判断任务是否完成

能够中断任务

能够获取任务执行的结果

向线程池中提交任务的submit方法不是阻塞方法,而Future.get方法是一个阻塞方法,当submit提交多个任务时,只有所有任务都完成后,才能使用get按照任务的提交顺序

CompletableFuture的exceptionally

Zhang Phil

07-12

1万+

CompletableFuture的exceptionally代码:private void test() {

System.out.println("开始...");

CompletableFuture.supplyAsync(new Supplier<String>() {

@Override

public String get()...

CompletableFuture异步编排(handle最终处理)

小志的博客

08-23

1533

CompletableFuture异步编排(handle最终处理)

【Java】Java8新特性:CompletableFuture

flora

06-17

455

CompletableFuture

Java CompletableFuture 详解

CompletableFuture——whenComplete与handle、thenApply与thenCompose的区别

DawdleD的博客

02-20

5803

CompletableFuture类提供了使用函数式编程风格来编排异步处理逻辑的方案。

本文将探讨标题所述的几个方法在使用场景方面的区别。

Java8异步类CompletableFuture详解

CharlesYooSky的博客

09-01

525

JDK8引入了一个新的类CompletableFuture

Java8 CompletableFuture(异步非阻塞)

李大能

06-08

1003

【代码】Java8 CompletableFuture(异步非阻塞)

Java8异步利器:CompletableFuture全网最全使用教程

weixin_44421461的博客

03-31

1025

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elast...

Java8 CompletableFuture 用法全解

学英语的程序员

09-27

1501

Java8 CompletableFuture 用法全解

java ide 工具使用详解

最新发布

01-11

Java IDE(Integrated Development Environment)是一种集成开发环境,用于编写、调试和运行Java程序。常见的Java IDE工具包括Eclipse、IntelliJ IDEA和NetBeans。

首先,打开IDE工具后,通常会看到一个项目管理界面,可以通过创建新项目或者导入已有的项目来开始编程。在创建或者导入项目时,需要设置项目的名称、位置和相关配置信息。

在项目中,可以创建Java类、接口、包等文件,然后在这些文件中编写Java代码。IDE工具会提供语法高亮、代码自动补全、代码格式化等功能,以帮助开发者提高编码效率。

在编写代码的过程中,可以通过IDE工具查看错误提示、编译代码、运行程序,并进行调试。调试功能非常重要,可以在代码中设置断点,逐行调试程序,查看变量的值,帮助开发者找出程序中的bug并进行修复。

除了编码和调试功能,IDE工具还提供了丰富的插件和扩展功能,可以根据需要安装相应的插件,扩展IDE工具的功能。比如可以安装版本控制插件、自动化构建插件、代码分析工具等,以提高开发效率和代码质量。

总的来说,Java IDE工具是Java程序员日常开发中不可或缺的利器,它集成了编码、调试、项目管理等功能,极大地提高了Java开发的效率和质量。希望以上解释对你有帮助。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

ThinkWon

CSDN认证博客专家

CSDN认证企业博客

码龄6年

Java领域优质创作者

284

原创

566

周排名

2175

总排名

1336万+

访问

等级

8万+

积分

29万+

粉丝

4万+

获赞

5474

评论

28万+

收藏

私信

关注

分类专栏

ElasticSearch

2篇

数据库语言SPL

3篇

读书笔记

8篇

Java8新特性

6篇

Python

2篇

Java面试总结

19篇

CentOS

5篇

日期时间

4篇

PyCharm

2篇

Quartz

1篇

读书清单

1篇

Swagger

1篇

团队与项目管理

2篇

程序员的一些思考

7篇

Java虚拟机

6篇

Spring Cloud

19篇

Tomcat

7篇

Spring

12篇

并发编程

33篇

集合容器

6篇

Redis

11篇

Java基础知识

32篇

MyBatis

21篇

日志

9篇

异常

5篇

Maven

7篇

常用工具类库

5篇

Spring Boot

6篇

Git

6篇

Docker

8篇

IntelliJ IDEA

4篇

Eclipse&Spring Tool Suite

1篇

数据结构与算法

12篇

LeetCode

8篇

设计模式

34篇

分布式

1篇

MySQL

4篇

Rabbit MQ

私密文章

最新评论

Java反射

imwangzikang:

setAccessible设置禁用访问检查

Java面试总结(2021优化版)发布&1024程序员节

xiaowangbadan0_0:

复制链接到微信打开

Java面试总结(2021优化版)发布&1024程序员节

xiaowangbadan0_0:

复制链接到微信打开

Java面试总结(2021优化版)发布&1024程序员节

牛子哥Zzz:

博主,链接无法跳转了

Spring面试题(2020最新版)

hacker_justin:

全是概念

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Elasticsearch 7.X版本常用语法语句

如何建立自己的认知体系

内存数据库如何发挥内存优势?

2023年2篇

2022年15篇

2021年32篇

2020年44篇

2019年226篇

目录

目录

分类专栏

ElasticSearch

2篇

数据库语言SPL

3篇

读书笔记

8篇

Java8新特性

6篇

Python

2篇

Java面试总结

19篇

CentOS

5篇

日期时间

4篇

PyCharm

2篇

Quartz

1篇

读书清单

1篇

Swagger

1篇

团队与项目管理

2篇

程序员的一些思考

7篇

Java虚拟机

6篇

Spring Cloud

19篇

Tomcat

7篇

Spring

12篇

并发编程

33篇

集合容器

6篇

Redis

11篇

Java基础知识

32篇

MyBatis

21篇

日志

9篇

异常

5篇

Maven

7篇

常用工具类库

5篇

Spring Boot

6篇

Git

6篇

Docker

8篇

IntelliJ IDEA

4篇

Eclipse&Spring Tool Suite

1篇

数据结构与算法

12篇

LeetCode

8篇

设计模式

34篇

分布式

1篇

MySQL

4篇

Rabbit MQ

私密文章

目录

评论 4

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

Java并发编程之CompletableFuture详解_java completablefuture-CSDN博客

>

Java并发编程之CompletableFuture详解_java completablefuture-CSDN博客

Java并发编程之CompletableFuture详解

咸鱼也有爱

已于 2022-10-12 15:59:17 修改

阅读量3k

收藏

4

点赞数

2

分类专栏:

面试总结

笔记

Java并发编程

文章标签:

java

分布式

于 2022-09-22 20:40:31 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/FlyingFish868/article/details/126980810

版权

面试总结

同时被 3 个专栏收录

16 篇文章

0 订阅

订阅专栏

笔记

13 篇文章

1 订阅

订阅专栏

Java并发编程

4 篇文章

0 订阅

订阅专栏

1、Futuru接口和Callable接口

Future接口定义了操作异步任务执行的方法,如:获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、是否执行完毕等 Callable接口中定义了需要有返回结果的任务 要执行的方法,如:主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过一段时间才会去获取子任务的执行结果 实现Callable接口中的call(),返回方法计算的结果,或抛出异常

2、FutureTask

代码示例:

public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException{

FutureTask futureTask = new FutureTask<>(() -> {

System.out.println("-----come in FutureTask");

try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }

return ThreadLocalRandom.current().nextInt(100);

});

Thread t1 = new Thread(futureTask,"t1");

t1.start();

//3秒钟后才出来结果,还没有计算你提前来拿(只要一调用get方法,对于结果就是不见不散,会导致阻塞)

//System.out.println(Thread.currentThread().getName()+"\t"+futureTask.get());

//3秒钟后才出来结果,我只想等待1秒钟,过时不候

System.out.println(Thread.currentThread().getName()+"\t"+futureTask.get(1L,TimeUnit.SECONDS));

System.out.println(Thread.currentThread().getName()+"\t"+" run... here");

}

get(): 一旦调用get()方法,不管是否计算完成都会导致阻塞

public static void main(String[] args) throws ExecutionException, InterruptedException {

FutureTask futureTask = new FutureTask<>(() -> {

System.out.println("-----come in FutureTask");

try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }

return ""+ ThreadLocalRandom.current().nextInt(100);

});

new Thread(futureTask,"t1").start();

System.out.println(Thread.currentThread().getName()+"\t"+"线程完成任务");

/**

* 用于阻塞式获取结果,如果想要异步获取结果,通常都会以轮询的方式去获取结果

*/

while (true){

if(futureTask.isDone()){

System.out.println(futureTask.get());

break;

}

}

}

isDone()轮询

轮询的方式会耗费无谓的CPU资源,且未必能及时地得到计算结果.如果想要异步获取结果,通常都会以轮询的方式去获取结果。尽量不要阻塞

3、CompletableFuture

CompletableFuture实现了Future,CompletionStage两个接口,故CompletableFuture功能更加强大

CompletableFuture CompletionStage

CompletionStage代表异步计算过程中的某个阶段,一个阶段完成以后可能会触发另外一个阶段,有些类似Linux系统的管道分隔符传参数一个阶段的计算执行可以是一个Function,Consumer或者Runnable一个阶段的执行可能是被单个阶段计算完成后触发,也可能是由多个阶段一起触发 CompletionStage 接口中的方法比较多,CompletableFuture 的函数式能力就是这个接口赋予的。从这个接口的方法参数你就可以发现其大量使用了 Java8 引入的函数式编程。

4、CompletableFuture核心的四个静态方法

runAsync 无 返回值

public static CompletableFuture runAsync(Runnable runnable)

public static CompletableFuture runAsync(Runnable runnable,Executor executor)

supplyAsync 有 返回值

public static CompletableFuture supplyAsync(Supplier supplier)

public static CompletableFuture supplyAsync(Supplier supplier,Executor executor)

没有指定Executor的方法,直接使用默认的ForkJoinPool.commonPool() 作为它的线程池执行异步代码如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码

static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 10L, TimeUnit.SECONDS,

new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());

private static void testSimpleCompletableFuture() throws InterruptedException, ExecutionException {

CompletableFuture future = CompletableFuture.runAsync(() -> {

System.out.println(Thread.currentThread().getName() + "\t is coming in ...");

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println(Thread.currentThread().getName() + "\t task was finished!");

});

// },poolExecutor);

// 如果使用了自行创建的线程池,则使用自定义的或者特别指定的线程池执行异步代码

System.out.println(future.get()); // get方法返回null,因为runAsync方法无返回值

}

ForkJoinPool.commonPool-worker-1 is coming in ...

ForkJoinPool.commonPool-worker-1 task was finished!

null

同上,将runAsync方法改为supplyAsync方法,并返回一个整数类型的变量

static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 10L, TimeUnit.SECONDS,

new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());

private static void testSupplyAsync() throws InterruptedException, ExecutionException {

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

System.out.println(Thread.currentThread().getName() + "\t is coming in ... supplyAsync");

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println(Thread.currentThread().getName() + "\t task was finished!");

// return ThreadLocalRandom.current().nextInt(100);

return Runtime.getRuntime().availableProcessors();

});

// },poolExecutor);

System.out.println(future.get()); // get方法返回null,因为runAsync方法无返回值

}

输出结果:

ForkJoinPool.commonPool-worker-1 is coming in ... supplyAsync

ForkJoinPool.commonPool-worker-1 task was finished!

8

5、减少阻塞和轮询

从Java8开始引入了CompletableFuture,它是Future的功能增强版,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法

private static void testWhenCompleteAndExceptionally() {

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

//主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭:暂停3秒钟线程

long result = ThreadLocalRandom.current().nextLong(100);

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println("异步任务计算完成,结果为:" + result);

if (result > 5) {

int i = 1 / 0;

}

return result;

}).whenComplete((res, err) -> {

if (err == null) {

System.out.println("异步任务执行正常,其结果为:" + res);

}

}).exceptionally(e -> {

System.out.println("exceptionally,异步任务执行异常:" + e.getCause() + "< --- >" + e.getMessage());

return Runtime.getRuntime().freeMemory();

});

System.out.println(Thread.currentThread().getName() + " task was finished! ...");

// 主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭:暂停3秒钟线程

try {

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

}

输出结果:

main task was finished! ...

异步任务计算完成,结果为:39

exceptionally,异步任务执行异常:java.lang.ArithmeticException: / by zero< --- >java.lang.ArithmeticException: / by zero

小总结异步任务不管是正常结束,还是出现异常,都会自动回调某个方法主线程设置好回调函数后,不再关心异步任务的执行,异步任务之间可以顺序执行

6、电商网站的比价需求案例

对于分布式微服务的调用,按照实际业务,如果是无关联step by step的业务,可以尝试是否可以多箭齐发,同时调用。我们去比同一个商品在各个平台上的价格,要求获得一个清单列表,分别同时或异步查询某个商品在各大商城中的价格,查完京东查淘宝,查完淘宝查天猫…实现方法如下: 代码实现1(逐个查询):

class Emall {

@Getter

private String emallName;

public Emall(String emallName) {

this.emallName = emallName;

}

// 生成随机数,模拟价格计算

public double computePrice(String productName) {

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

return ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0);

}

}

static List list = Arrays.asList(

new Emall("jdong"),

new Emall("dangdang"),

new Emall("taobao"),

new Emall("pdd"),

new Emall("tmall")

);

// 实现基本的功能需求

// List --> map --> List

public static List getPrice(List list, String productName) {

return list.stream().map(emall ->

String.format(productName + " in %s price is %.2f",

emall.getEmallName(), emall.computePrice(productName))

).collect(Collectors.toList());

}

代码实现2(一口气查询):

public static List getPriceByCompletableFuture(List list, String productName) {

List collect = list.stream().map(emall -> // 将每个商城对象emall映射成一个CompletableFuture异步任务,即将每个emall放到异步任务的线程中

CompletableFuture.supplyAsync(() ->

String.format(productName + " in %s price is %.2f",

emall.getEmallName(), emall.computePrice(productName))))

.collect(Collectors.toList())

.stream()

.map(s -> s.join())

.collect(Collectors.toList());

return collect;

}

两种实现方式的性能对比:

public static void main(String[] args) {

long startTime = System.currentTimeMillis();

List list2 = getPriceByCompletableFuture(list, "mysql");

for (String element : list2) {

System.out.println(element);

}

long endTime = System.currentTimeMillis();

System.out.println("异步处理任务 ----costTime: "+(endTime - startTime) +" 毫秒");

long startTime2 = System.currentTimeMillis();

List ansList = getPrice(list, "mysql");

for (String ele : ansList) {

System.out.println(ele);

}

long endTime2 = System.currentTimeMillis();

System.out.println("同步处理任务 ----costTime: "+(endTime2 - startTime2) +" 毫秒");

}

输出结果:

mysql in jdong price is 110.77

mysql in dangdang price is 110.44

mysql in taobao price is 109.06

mysql in pdd price is 109.14

mysql in tmall price is 109.60

异步处理任务 ----costTime: 1220 毫秒

mysql in jdong price is 110.81

mysql in dangdang price is 110.86

mysql in taobao price is 110.08

mysql in pdd price is 109.36

mysql in tmall price is 109.12

同步处理任务 ----costTime: 5050 毫秒

7、CompletableFuture常用方法

7.1、获得结果和触发计算

// 不见不散

public T get()

// 过时不候

public T get(long timeout, TimeUnit unit)

// 没有计算完成的情况下,给我一个替代结果

// 立即获取结果不阻塞 计算完,返回计算完成后的结果 没算完,返回设定的valueIfAbsent值

public T getNow(T valueIfAbsent)

// 和get方法功能类似,但join方法不需要抛出异常

public T join()

private static void testGetAndGetNow() {

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "111";

});

// try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }

// 注释掉如上的Sleep方法,getNow返回的结果是方法中设置的值"2222"

// 不注释如上的sleep方法,getNow方法的结果是future返回的结果值"111"

System.out.println(future.getNow("2222"));

}

System.out.println(CompletableFuture.supplyAsync(() -> "abc").thenApply(r -> r + "123").join());

// abc123

7.2、处理计算结果

thenApply方法: 计算结果存在依赖关系,这两个线程串行化,当前步骤有异常的话就停止执行

public static void main(String[] args) {

// 注意: 这里最好不要使用 ExecutorService service = Executors.newFixedThreadPool(3);的方式来创建线程池(见阿里开发手册)

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 5, 10, TimeUnit.SECONDS,

new ArrayBlockingQueue<>(2),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.CallerRunsPolicy()

//new ThreadPoolExecutor.AbortPolicy()

//new ThreadPoolExecutor.DiscardPolicy()

//new ThreadPoolExecutor.DiscardOldestPolicy()

);

// 当一个线程依赖另一个线程时用 thenApply 方法来把这两个线程串行化,

CompletableFuture.supplyAsync(()->{

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println("异步任务操作步骤 111");

return 1;

},threadPool).thenApply(res ->{

System.out.println("异步任务操作步骤 222");

return res + 2;

}).thenApply(res ->{

System.out.println("异步任务操作步骤 333");

// int i = 10 / 0; // 异常情况:哪步出错就停在哪步

return res + 3;

}).whenComplete((result,err)->{

if (err == null){

System.out.println("异步任务处理正常,计算结果为:" + result); // result = 1 + 2 + 3 = 6

}

}).exceptionally(e->{

e.getStackTrace();

System.out.println(e.getMessage());

return 404;

});

// 主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭,即主线程执行太快,导致异步任务无法执行,可以让主线程Sleep几秒

// 除了sleep的方法,还可以使用线程池来处理,注意,最后一定关闭线程池 threadPool.shutdown(); 否则,程序会一直处于运行状态

System.out.println(Thread.currentThread().getName() + "\t" + " --- 主线程先去忙其他任务");

// try {

// TimeUnit.SECONDS.sleep(1);

// } catch (InterruptedException e) {

// throw new RuntimeException(e);

// }

threadPool.shutdown();

}

handle方法: 出现异常也可以继续执行,根据带的异常参数可以进一步处理

// 当一个线程依赖另一个线程时用 handle 方法来把这两个线程串行化,

// 异常情况:有异常也可以往下一步走,handle会根据异常参数在最后抛出对应的异常

CompletableFuture.supplyAsync(() -> {

//暂停几秒钟线程

try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }

System.out.println("111");

return 1024;

}).handle((f,e) -> {

// int age = 10/0;

System.out.println("222");

return f + 1;

}).handle((f,e) -> {

System.out.println("333");

return f + 1;

}).whenCompleteAsync((res,e) -> {

System.out.println("任务处理的结果为: "+res);

}).exceptionally(e -> {

e.printStackTrace();

return null;

});

System.out.println("-----主线程结束, END");

// 主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭:

try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }

7.3、消费计算结果

thenRun:thenRun(Runnable runnable),任务A和B依次先后执行,并且B不需要A的结果thenAccept:thenAccept(Consumer action),任务A和B依次先后执行,B需要A的结果任务A和B依次先后执行,B需要A的结果,但是任务B无返回值thenApply:thenApply(Function fn),任务A和B依次先后执行**,B需要A的结果,同时任务B有返回值**

CompletableFuture.supplyAsync(()->{

return 1;

}).thenApply(num ->{

return num + 2;

}).thenApply(num ->{

return num + 3;

}).thenAccept(num -> System.out.println(num));

System.out.println("--------------------");

System.out.println(CompletableFuture.supplyAsync(()-> "the resultA of thenRun").thenRun(()->{

System.out.println("thenRun,B不需要A的结果");

}).join());

System.out.println(CompletableFuture.supplyAsync(()-> "任务A和B依次先后执行,B需要A的结果,thenAccept").thenAccept(res -> System.out.println(res + ",任务B无返回值")).join());

System.out.println(CompletableFuture.supplyAsync(()-> "任务A和B先后执行,B需要A的结果").thenApply(str -> str + " --> 任务B有返回值").join());

线程池运行选择 - 如果没有传入自定义的线程池,则使用默认线程池ForkJoinPool - 如果执行第一个任务,传入了一个自定义线程池,调用thenRun方法执行第二个任务时,则第二个任务和第一个任务共用一个线程池,调用thenRunAsync方法执行第二个任务时,则第一个任务使用的是传入的自定义线程池,第二个任务使用的是ForkJoinPool - 可能存在程序处理太快的情况,系统会优化切换原则,直接使用主线程处理

7.4、计算速度选用

applyToEither方法:任务谁执行快,就用谁(选用执行速度最快的任务 返回的结果作为最后的总结果)

public CompletableFuture applyToEither(

CompletionStage other, Function fn)

使用实例:

CompletableFuture planA = CompletableFuture.supplyAsync(() -> {

System.out.println("A coming in...");

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

return "planA";

});

CompletableFuture planB = CompletableFuture.supplyAsync(() -> {

System.out.println("B coming in...");

try {

TimeUnit.SECONDS.sleep(3);

// TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

return "planB";

});

CompletableFuture result = planA.applyToEither(planB, p -> {

return p + " is winner!"; // 两个任务planA和planB,谁执行得更快,p就是对应的返回结果

});

// 补充:

// join()和get()方法类似,其不同在于使用get方法需要抛出异常 或 进行异常捕获,

// join()则不需要抛出异常,也不用进行异常捕获,但出现异常时,会直接抛异常

System.out.println(Thread.currentThread().getName() + "\t" +result.join());

7.5、合并计算结果

两个CompletionStage任务都完成后,最终能把两个任务的结果一起交给thenCombine来处理, 先完成的任务需要等待其他分支任务完成,最后合并任务的计算结果thenCombine:将两个异步任务的返回结果进行合并,再返回最后的结果值

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {

System.out.println(Thread.currentThread().getName() + "\t --- 开始执行任务1...");

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

return 20;

});

CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {

System.out.println(Thread.currentThread().getName() + "\t -- 开始执行任务2..");

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

return 30;

});

CompletableFuture result = future1.thenCombine(future2, (x, y) -> {

System.out.println("---> 合并两个任务的计算结果");

return x * y;

});

System.out.println(result.join());

//System.out.println(result.get()); // get方法需要抛出异常或进行异常捕获

参考资料:尚硅谷2022版JUC并发编程

优惠劵

咸鱼也有爱

关注

关注

2

点赞

4

收藏

觉得还不错?

一键收藏

知道了

0

评论

Java并发编程之CompletableFuture详解

在项目中经常会使用到CompletableFuture ,很多开源框架中也大量使用到了 CompletableFuture 。因此,专门写一篇文章来介绍这个 Java 8 才被引入的一个非常有用的用于异步编程的类。CompletableFuture 同时实现了 Future 和 CompletionStage 接口。

复制链接

扫一扫

专栏目录

java并发编程之cas详解

08-28

主要介绍了java并发编程之cas详解,涉及cas使用场景和cas用作原子操作等内容,具有一定参考价值,需要的朋友可以了解下。

Java 并发编程之ThreadLocal详解及实例

08-31

主要介绍了Java 并发编程之ThreadLocal详解及实例的相关资料,需要的朋友可以参考下

参与评论

您还未登录,请先

登录

后发表或查看评论

@Async结合CompletableFuture实现主线程阻塞,CompletableFuture并发执行任务

cmw1085215666的博客

01-30

367

项目开发中经常会遇到业务需要多任务处理的场景,比如目前我除了的业务就是如此。我要提供给客户端一个批量查询第三方数据的接口,由于是调用第三方的接口,相应时间受到网络环境的影响,如果需要查询的的数据过多,响应时间就会很长,所有这里使用异步处理,但是需要阻塞主线程,拿到所以数据后由主线程进行处理再返回给用户,是个时候就需要使用多线程的工具,@Async结合CompletableFuture实现主线程阻塞,CompletableFuture并发执行任务。

Java并发编程之阻塞队列详解

09-02

主要为大家详细介绍了Java并发编程之阻塞队列,什么是阻塞队列?主要的阻塞队列及其方法介绍,感兴趣的小伙伴们可以参考一下

Java并发编程之ConcurrentHashMap

02-26

ConcurrentHashMap是一个线程安全的HashTable,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类HashTable的结构,Segment内部维护了一个链表数组,我们用下面这一幅图来看下ConcurrentHashMap的内部结构:从上面的结构

java 异步 CompletableFuture 详解

lockie的博客

11-23

1812

java 异步 CompletableFuture

Java之CompletableFuture异步、组合计算基本用法

OceanSky的专栏

10-29

3695

CompletableFuture是Java8新增的Api,该类实现了Future和ComplateStage两个接口,提供了强大的Future扩展功能,可以简化异步编程的复杂性,提供了函数编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。

Future:表示一个任务的生命周期,并提供了相应的方法来判断是否已经完成或取消,以及获取任务的...

【JAVA8】CompletableFuture使用详解

热门推荐

胖虎儿的博客

08-22

1万+

CompletableFuture!让你的代码免受阻塞之苦!

灵活的使用`CompletableFuture`可以让我们感受java8的异步编程之美!

Java并发基础:CompletableFuture全面解析

最新发布

科技互联网领域深度探索者,乐于分享与写作。

02-19

885

CompletableFuture类使得并发任务的处理变得简单而高效,通过简洁的API,开发者能轻松创建、组合和链式调用异步操作,无需关心底层线程管理,这不仅提升了程序的响应速度,还优化了资源利用率,让复杂的并发逻辑变得易于掌控。

Java的Future机制详解

u013950690的博客

03-31

2560

B图表达的是使用Future模式之后,我们主线程在invoke之后可以立即返回,去做其他的事情,回头再来看看刚才提交的invoke有没有结果。而如果使用第二个构造函数那么最后获取线程实行结果就是参数中的result,接下来让我们看一下FutureTask的run方法。方法能准确地告诉你某个字段相对于对象的起始内存地址的字节偏移量,因为是相对偏移量,所以它其实跟某个具体对象又没什么太大关系,跟class的定义和虚拟机的内存模型的实现细节更相关。get方法有两个,一个是有超时时间设置,另一个没有超时时间设置。

CompletableFuture用法详解

qq_36042938的博客

08-09

2260

小笔记

java CompletableFuture 详解

zhaoliubao1的博客

03-31

837

CompletableFuture是Java 8中新增加的异步编程工具,可以用于处理异步任务,并在任务完成后进行处理。它支持链式调用、组合多个CompletableFuture、异常处理、超时处理和取消操作等特性。使用CompletableFuture可以让我们更加方便地处理异步任务,提高程序的性能和可读性。Java CompletableFuture是Java 8中新增加的异步编程工具,可以用于处理异步任务,并在任务完成后进行处理。支持组合多个CompletableFuture。

Java并发编程——CompletableFuture类

Hopefully Sky的博客

07-27

3522

从Future接口开始

java.util.concurrent.Future接口是Java 5添加的类,用来描述一个异步计算的结果。可以使用该接口的isDone()方法检查计算是否完成,或者使用get()阻塞住调用线程,直到计算完成返回结果,也可以使用cancel()方法停止任务的执行。

ExecutorService es = Executors.newFixedThreadPool(10);

Future f = es.submit(() ->{

/

CompletableFuture:让你的代码免受阻塞之苦

yangxiaofei_java的博客

08-11

702

文章目录前言场景说明CompletableFuture使用CompletableFuture的创建:结果的获取:异常处理:同步方法Pick异步方法查询所有店铺某个商品价格为什么仍需要CompletableFuture其他API介绍whenComplete计算结果的处理提供了三个方法说明示例thenApply转换提供了三个方法说明示例thenAccept结果处理提供了三个方法说明示例thenCompose异步结果流水化提供了三个方法说明示例执行流程图thenCombine组合结果提供了三个方法说明示例执行..

Java并发编程——CompletableFuture详解

Java是世界上最好的语言

11-15

2343

Future/Callable

Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

Future接口可以构建异步应用,是多线程开发中常见的设计模式。

当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。

因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。

简单实现

public class Fut

java 异步编程 CompletableFuture

m0_71149992的博客

06-17

3139

同步:就是在发出一个功能调用时,在没有得到结果之前,将一直处于等待中 即阻塞状态。也就是必须一件一件事做,等前一件做完了才能做下一件事异步:异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。

没有返回值的异步任务

有返回值的异步任务

thenAccept 消费处理结果, 接收任务的处理结果,并消费处理,无返回结果。

异常处理

exceptionally 异常

java并发编程Future类详解

Koikoi12的博客

01-24

7143

作用和举例

future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例:

小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时候,future.get获取,继续做接下来的事情

但要注意的是当还没获取外卖的时候,主线程中用餐这一步是卡住的

JDK中的Future实现

结构如下

常用方法:

cancel():如果等太久,你可以直接取消这个任务

isCancelled():任务是不是已经取消了

isDone():任务是不是已经完成了

任务编排:CompletableFuture从入门到精通

Java技术攻略的博客

03-22

1471

最近遇到了一个业务场景,涉及到多数据源之间的请求的流程编排,正好看到了一篇某团介绍CompletableFuture原理和使用的技术文章,主要还是涉及使用层面。网上很多文章涉及原理的部分讲的不是特别详细且比较抽象。因为涉及到多线程的工具必须要理解原理,不然一旦遇到问题排查起来就只能凭玄学,正好借此梳理一下CompletableFuture的工作原理。

Java8 CompletableFuture底层实现及使用详解

程序员野蛮成长

07-14

586

该方法的区别在于,它将任务串联起来,可以实现多个异步操作的链式调用。然后,通过thenApply方法将该CompletableFuture对象转换为一个新的CompletableFuture对象,用于异步执行一个返回整数类型的任务,转换函数是将字符串长度作为结果返回。thenCompose方法接收一个Function类型的参数,该函数用于将一个CompletableFuture对象的结果作为下一个CompletableFuture对象的输入,并返回一个新的CompletableFuture对象。

java并发编程艺术 pdf

11-25

《Java并发编程艺术》是一本经典的Java并发编程指南,由Brian Goetz等人合著。该书系统地介绍了Java并发编程的原理、技术和最佳实践,内容涵盖了并发编程的基础知识、线程安全性、并发性能、并发数据结构、并发工具...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

咸鱼也有爱

CSDN认证博客专家

CSDN认证企业博客

码龄4年

暂无认证

41

原创

74万+

周排名

8万+

总排名

4万+

访问

等级

474

积分

10

粉丝

40

获赞

10

评论

125

收藏

私信

关注

热门文章

招银网络面试总结

12402

安全框架SpringSecurity实战总结(一)

5415

Java并发编程之CompletableFuture详解

3042

安全框架实战总结之SpringSecurity+Oauth2(二)

2443

SpringBoot+Mybatis+Redis缓存实战总结

1818

分类专栏

笔记

13篇

Java后端开发

18篇

面试总结

16篇

Java并发编程

4篇

Redis

5篇

安装教程

2篇

Java后端

7篇

设计模式

1篇

Java基础

4篇

消息中间件

3篇

Spring

6篇

计算机基础

1篇

动态规划

1篇

数据结构与算法

最新评论

面试总结之微服务篇

简单简单小白:

感谢博主的优质好文,文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文!

安全框架SpringSecurity实战总结(一)

sos丿mcc:

讲的真好

RabbitMQ之交换机总结(图文并茂讲解)

跳动的bit:

三连支持

线程池知识点及面试总结

咸鱼也有爱:

多谢

线程池知识点及面试总结

咸鱼也有爱:

好的,谢谢你这么好看,还关注我

最新文章

面试总结之消息中间件

面试总结之并发编程

面试总结之Java基础

2023年8篇

2022年21篇

2021年12篇

2020年1篇

目录

目录

分类专栏

笔记

13篇

Java后端开发

18篇

面试总结

16篇

Java并发编程

4篇

Redis

5篇

安装教程

2篇

Java后端

7篇

设计模式

1篇

Java基础

4篇

消息中间件

3篇

Spring

6篇

计算机基础

1篇

动态规划

1篇

数据结构与算法

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

Homepage of Chensong Zhang's webpage

Homepage of Chensong Zhang's webpage

Chen-Song Zhang

State Key Laboratory of Scientific and Engineering Computing

HomeAbout MeResearchTeachingConferenceSoftwareLinks

CAS WebpageCAS WebmailEducation CloudAMSS WebpageAMSS OnlineAMSS LoginNCMIS WebpageICMSEC WebpageLSEC WebpageLSEC Seminars

ProfessorInstitute of Comp Math and Scientific/Engineering ComputingAcademy of Mathematics and Systems ScienceChinese Academy of SciencesEmail: zhangcs AT lsec DOT cc DOT ac DOT cnMobil: +86-135-2040-7990Work: +86-010-8254-1012Office: Room 210, S/T Complex Bldg (LSEC)No. 55, Zhong Guan Cun Dong LuBeijing, CHINA 100190北京市海淀区中关村东路55号科技综合楼210室Map on Baidu (Chinese), Google (English)

Last updated on Feb 28, 2024 :: All rights reserved. © 2011--Present C.-S. Zhang :: Contact Me

北京的各个行政区都有什么特点? - 知乎

北京的各个行政区都有什么特点? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册北京北京生活城市行政区划基础设施建设北京的各个行政区都有什么特点?之前看过一个回答,说“朝阳区有钱,海淀区有文化等等”,这样把地区人格化,挺有趣的。 题主希望能得到以下方面的介绍: 居民特点 基础设施建设 教育资源 …显示全部 ​关注者557被浏览826,802关注问题​写回答​邀请回答​好问题 23​添加评论​分享​28 个回答默认排序中华活地图出门不用看地图的红色青年​ 关注北京人 北京生 北京长 对各区都略知一二从城里逐渐往城外说吧(流水账来袭)估计我说的会很跑题东西城,首都核心区,这两个区关系太紧密我就不分开说了,国家大部分机构部委以及最核心的地方也在这。共和国的政治中心。这两个区囊括了北京二环内的全部区域,二环就是北京内外城城墙的原位,充满了皇家气息,紫禁城就在这里,以前皇上住的地方。两个区内没有什么高层建筑,北京核心区限高。两个区内平房四合院挺多的。其实虽然地理位置好,但是住的还真不一定舒服。之前去我妈一个朋友家,她家在德内斜街附近一个胡同里,我进了阿姨她家就压抑的慌,六七平米的院子,20平米的房子采光十分不好,冬天取暖靠空调,空调外挂机占了为数不多的小院面积。。。朝阳区。。CBD在这,望京在这,奥林匹克中心区,三里屯在这,十八里店也在这,黑桥也在这。。。你说它有钱吧,他还真有钱,北京市GDP第一。你说它不尽如人意吧,也有。我说当今是微缩版的中国没问题吧。海淀区 北大在这,清华在这,北航在这。。。在京所有985大学本部和90%的211大学本部在这(北京不在海淀区的211大学只有对外经贸,北化工,中传媒,华北电力,中国石油,北工大)(评论区指正我四次了 我先落下了北化工,又落下了中传媒,第三次落下了华电。。。中国石油不止在青岛,中国石油不止在青岛,中国石油不止在青岛),甚至连中科院也在这。。。这里还不光有学术,香山在这,颐和园在这,圆明园在这,玉泉山也在这。。。还是个充满园林氛围的地方。。。北京市乃至全国我最喜欢的城区没有之一丰台区。。。作为在丰台区出生丰台区长大丰台区上完小学初中高中的人来说,真是恨铁不成钢。。一个被铁路和大院割裂了的城区的典型(当然还有其他因素),北京西站在这,北京南站在这,丰台站在这,丰台西站在这……北京五个铁路特等站丰台区有四个。就我们高中,往南一公里是铁路,往北三公里是铁路,往西一公里有个XX大院。我家往北一公里是铁路,往西一公里是京沪高铁。。。不说了,也不能怨天尤人。希望随着丽泽总部基地南中轴崛起能有起色一些。。。石景山区。。想当初因为伟大的首钢然后从丰台区划出去了,现在比丰台强不少心里肯定也很爽吧。。市里边又把冬奥组委放到石景山了,还能拉动一波。不过之前地铁修的有点慢,1号线通车50年之后终于迎来了第二条6号线。。以后就该快了门头沟区。。除了城区一小旮瘩之外地无三尺平,北京的贵州。不过风景还是很不错的,之前开车有109国道盘山的时候别有一番感受,雁翅镇往西就没去过了就不说了房山区。。我记得小时候一直闹不清房山是啥,良乡是啥,燕山又是啥……好似很乱的样子。所以我一直不太敢去,虽然家住丰台的我离房山不远,但是第一次进房山区已经是地铁开通的时候了,后来才慢慢分清楚良乡是啥,房山城关和房山区,还有燕山燕化。目前最远深入到上方山。。十渡还没去过大兴区。。其实我家离大兴区边界只有两公里,所以还是比较熟的。很小的时候我记得黄村正月十五有灯会,爸妈带着我坐着公交车就去了,现在大兴区三个方向有三条进城地铁,这从城六区外的十个区来看已经是很多的了。。而且随着今年国庆节大兴机场的运营,还能拉动大兴一波通州区。。副中心,上个月北京市委市政府市人大市政协四套班子已经搬过去了,不知道地图上表示北京的那个五角星啥时候画过去(滑稽)通州区环境算挺好的了,大运河的起点,好多河流经过通州。北京离海最近的地方,北京最水灵灵的地方顺义区。。小时候听说顺义就是因为机场和牛栏山二锅头(虽然机场属于朝阳区)。之后再听说顺义就是奥运会时候的水上公园了。第一次进到顺义城区也已经是15号线开通之后的事情了。在我眼里是一个凭借机场优势,借助航空闷声大发财的区昌平区。。回天有我!回天有我!回天有我~我第一次听到“睡城”这个词还就是因为回龙观天通苑,两个号称亚洲number one的社区就在昌平。这俩在昌平区边上,如果昌平区往深了走,那还就是去居庸关长城了,初中跟爸妈一次,高三高考百日誓师的时候学校带着登长城壮行。。。平谷。。兄弟平谷大桃吃不,来点开点来点。当然我印象最深的不是平谷大桃,也不是金海湖,也不是京东大峡谷。。。是平谷人似唐山非唐山,似天津非天津,似东北非东北的口音,跟隔壁天津蓟州(蓟县)差不多的口音怀柔。。大长条,太长了太长了太长了。南北跨度应该比密云大。之前去喇叭沟门,从家开到怀柔城区一个半小时,从怀柔城区盘山到喇叭沟门两个小时。。喇叭沟门和丰宁县的联系恐怕比和怀柔城区近不少吧,和北京城六区的联系就是没有联系了吧密云。。水库和古北口是最先知道的地方。我第一次解锁密云已经是高考结束第二天了,爸妈开车我们一块去水库边上吃鱼了。。另外不知道古北水镇晚上怎么样,没在那呆一宿挺遗憾的。。延庆。。北京唯一一个城区游离在华北平原之外的区,延庆城区跑到了燕山太行山外的盆地上,唯一一个从市区过去需要翻山越岭的城区。不过造就了不同于市区的气候,比如emmm雪多,也让北京有了申办冬奥会的理由。。。想到啥再往流水账上加编辑于 2019-03-20 08:03​赞同 122​​46 条评论​分享​收藏​喜欢收起​知乎用户CrtaUy​ 关注先给不熟悉北京行政区划的人们上一张北京地图:好,接下来就一个一个说:东城区北京名胜古迹最多的区,也是答主长大的区。你能想到的北京很多名胜古迹,比如说天安门、故宫、国博、雍和宫、国子监、天坛、南锣鼓巷、美术馆…全在东城区,北京站也在东城区,王府井也在东城区,总之是一个旅游景点众多的区。西城区与东城区联系很紧密,也拥有很多名胜古迹,北京教育资源最好的区之一,有金融街、西单这样繁华的商业街。海淀区海淀很大,分为山前地区和山后地区。山前地区是高校、高科技云集的地方,也是北京教育制高点,山后地区就和农村没什么区别了。朝阳区同样是一个面积很大的区,这是北京商业最发达、最时尚的区之一,国贸、望京、奥森、鸟巢、水立方…全都在朝阳,但是也有大片的工业区和农村。丰台区北京城六区中发展得差强人意的一个区,和北边发展差异很大,被铁路和大院分割,河西的长辛店、云岗、王佐等地区虽然也属于城六区但被边缘化。石景山区北京城六区中存在感最低的一个,也是答主大学所在的区。首钢搬迁后发展一度陷于停滞,地铁曾经只有一条1号线,但是借着冬奥会又发展了一波,地铁也越修越多。昌平区昌平很大程度上是作为海淀、朝阳的睡城存在的,回龙观和天通苑是昌平最繁华的区域,其次是北七家,城区在六环外,十三陵也在昌平。顺义区许多北京本土企业就在顺义,有郊区最好的中学之一——牛栏山一中,也是北京国际学校云集的一个区,可以说顺义的家长很多走的是国际路线。通州区北京目前的市zf所在地,城市副中心,之前一直作为国贸的睡城存在,每天早高峰八通线的客流emmm…近年来也是借着城市副中心的光发展的很好,未来可期。大兴区离北京市中心最近的郊区,位于北京正南方,拥有亦庄这个开发区,大兴城区也就是黄村发展的也不差(答主家有很多亲戚就在大兴)。房山区偏居北京西南,周口店猿人遗址所在地,很多高校选择在良乡大学城办学,但是发展嘛…差强人意。门头沟区北京山地占比最高的区,甚至比“地无三尺平”的贵州还多山,城区只有东边的一小块,往西走就是连绵的山。延庆区你可能没有听说过延庆,但是八达岭长城、世园会、冬奥…这一切的一切都与延庆有关,来北京一定要爬的八达岭长城就在延庆。延庆城区距离北京市中心最远且不在华北平原上,但是到达延庆的方式多种多样,有919、S2线、京张高铁…怀柔区北京南北跨度最大的区,最北端喇叭沟门也是北京的最北端,红螺寺、慕田峪长城、雁栖湖都在怀柔,近年来又搞了一个怀柔科学城。密云区说到密云这个区,很多人脑袋里第一时间反映出来的一定是密云水库,这是一个因为水库而出名的区,也是自然风光优美的一个区。平谷区如果说密云是因为水库出名,平谷就是因为大桃出名了。而且在这次疫情中,平谷和它的邻居蓟县没有一例确诊病例,平谷是北京唯一一个没有确诊病例的区。编辑于 2022-02-13 23:06​赞同 251​​59 条评论​分享​收藏​喜欢