c语言sscanf函数的用法是什么
260
2022-10-24
JDK1.8使用的接口类
completableFuture是JDK1.8版本新引入的类。下面是这个类:
实现了俩接口,本身是个class。这个是Future的实现类,使用completionStage接口去支持完成时触发的函数和操作。
一个completetableFuture就代表了一个任务,他能用Future的方法,还能做一些之前说的executorService配合futures做不了的。
之前future需要等待isDone为true才能知道任务跑完了,或者就是用get方法调用的时候会出现阻塞,而使用completableFuture的使用就可以用then,when等等操作来防止以上的阻塞和轮询isDone的现象出现。
1.创建CompletableFuture直接new对象。
一个completableFuture对象代表着一个任务,这个对象能跟这个任务产生联系。
下面用的complete方法意思就是这个任务完成了需要返回的结果,然后用get()方法可以获取到。
2.JDK1.8使用的接口类。
在本文的CompletableFuture中大量的使用了这些函数式接口。
而lambda函数正好是可以作为这些接口的实现。例如 s->{return 1;} 这个就相当于一个Function。因为有入参和返回结果。
3.下面是这个类的静态方法
带有Async就是异步执行的意思、也是一个completableFuture对象代表着一个任务这个原则。
这种异步方法都可以指定一个线程池作为任务的运行环境,如果没有指定就会使用ForkJoinPool线程池来执行
注:跟get方法无关,后面有答案
答案:
造成这个原因是因为Daemon。因为completableFuture这套使用异步任务的操作都是创建成了守护线程,那么我们没有调用get方法不阻塞这个主线程的时候。主线程执行完毕,所有线程执行完毕就会导致一个问题,就是守护线程退出。
那么我们没有执行的代码就是因为主线程不再跑任务而关闭导致的,可能这个不叫问题,因为在开发中我们主线程常常是一直开着的。但是这个小问题同样让我想了好久。
下面我们开一个非守护线程,可以看到程序执行顺利。
这个代码就是操作本地文件,并且sleep了一秒。其他线程就一句控制台输出的代码,最终的结果是文件没有任何变化。
当我把主线程sleep 5秒时,本地文件会写入一句 this is completableFuture daemon test 验证成功。
(2)allOf&anyOf
这两个方法的入参是一个completableFuture组、allOf就是所有任务都完成时返回,但是是个Void的返回值。
anyOf是当入参的completableFuture组中有一个任务执行完毕就返回,返回结果是第一个完成的任务的结果。
这个方法是执行这个方法的时候任务执行完了就返回任务的结果,如果任务没有执行完就返回你的入参。
这个有三个名差不多的方法:whenComplete、whenCompleteAsync、还有一个是whenCompleteAsync用自定义Executor
下面图中test的输出跟whenComplete方法运行的线程有关,运行到main线程就会阻塞test的输出,运行的是completableFuture线程则不会阻塞住test的输出。
如果调用的中途没有发生其他任务且在触碰到whenComplete方法时completableFuture这个任务还没有彻底执行完毕那么就会用completableFuture这个任务所使用的线程。
下面是whenCompleteAsync方法。这个方法就是新创建一个异步线程执行。所以不会阻塞。
注:whenComplete中出现的问题在then中测试不存在、使用的就是上一个任务的线程。这个thenCompose就是一个任务执行完之后可以用它的返回结果接着执行的方法,方法返回的是另一个你期盼泛型的结果。
compose理解就是上一个任务结果是then的一部分。
这个combine的理解就是结合两个任务的结果。
thenRun就是这个任务运行完,再运行下一个任务,感觉像是join了一下。
像thenApply(Function);这样的就是有入参有返回值类型的。
像thenAccept(Consumer);这样的就是有入参,但是没有返回值的。详情在上文中有过关于函数式接口的叙述。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~