use*_*052 3 java java-8 completable-future
想知道 completablefuture 是否可以在创建它的线程中运行。您可能会问为什么我需要这样做,因为 completablefuture 是用于异步编程的。原因是我有一些异步任务和一些我想在生成线程中运行的任务,以便我可以使用 allOf 等并保持代码的一致性
当你说你想知道“一个完整的未来是否可以在创建它的线程中运行”时,你表现出了错误的心态。ACompletableFuture
不运行。ACompletableFuture
只是封装了一个值或者异常,最多可以设置一次,我们称之为完成它。
API 提供了许多用于安排完成尝试的方法(可能是异步的),但您不应该因决定如何完成它而分心。
\n\n异步完成有一些简单的替代方案:
\n\nCompletableFuture<String> f = CompletableFuture.completedFuture("hello");\n
Run Code Online (Sandbox Code Playgroud)\n\n创造一个立即完成的未来。Java\xc2\xa09 添加failedFuture
对创建立即异常完成的未来的支持。
您还可以轻松创建一个稍后在同一线程中完成的 future:
\n\nCompletableFuture<String> f = new CompletableFuture<>();\n\n// arbitrary actions\n\nf.complete("hello");\n
Run Code Online (Sandbox Code Playgroud)\n\n您还可以将工厂方法与执行器一起使用,立即在启动线程中运行操作:
\n\nCompletableFuture<String> f\n = CompletableFuture.supplyAsync(() -> "hello", Runnable::run);\n
Run Code Online (Sandbox Code Playgroud)\n\n或者
\n\nCompletableFuture<String> f\n = CompletableFuture.supplyAsync(() -> {\n if(Math.random() > 0.5) throw new IllegalStateException();\n return "hello";\n }, Runnable::run);\n
Run Code Online (Sandbox Code Playgroud)\n\n演示与调用的区别complete
或创建立即完成的未来的区别。
当然,这些可能性可以与其他功能相结合,例如allOf
:
CompletableFuture<String> a = new CompletableFuture<>();\nCompletableFuture<String> b = new CompletableFuture<>();\nCompletableFuture<String> c = new CompletableFuture<>();\n\nCompletableFuture.allOf(a, b, c).whenComplete((__, t) -> {\n if(t != null) System.err.println("failed with "+t);\n else System.out.println("all completed "+a.join()+", "+b.join()+", "+c.join());\n});\n\nSystem.out.println("step 1");\na.complete("foo");\nSystem.out.println("step 2");\nb.complete("bar");\nSystem.out.println("step 3");\nc.complete("baz");\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
3289 次 |
最近记录: |